home *** CD-ROM | disk | FTP | other *** search
/ Light ROM 1 / LIGHT-ROM 1 (Amiga Library Services)(1994).iso / ffdisks / d949.lha / BBBBS / BBBBS65.lha / rexx / BBBBS.baud < prev    next >
Text File  |  1993-10-31  |  204KB  |  7,419 lines

  1. /* $VER: BBBBS.baud 6.5 © 1993 Richard Lee Stockton 7:58PM (31.10.93)
  2.        - FREELY DISTRIBUTABLE AS LONG AS THIS NOTICE REMAINS -
  3.  
  4.        BBBBS.baud. A full-featured BBS in ARexx for Baudbandit
  5.   based on 'Answer.baud'. Thanks to Greg Cunningham for BaudBandit!
  6.    See Information/BBBBS.doc & rexx/bbsLOCAL.rexx for install info
  7. */
  8.  
  9. saypath='SYS:Utilities/Say'
  10.  
  11. copyright.=''
  12. copyright.1=STRIP(SUBSTR(SOURCELINE(1),10))
  13. copyright.2='
  14. from Gramma Software 21305-60th Ave West, Mountlake Terrace WA 98043-2009'
  15. copyright.3='
  16. ARexx portions of this software copyright 1990-93 Richard Lee Stockton'
  17. copyright.4='- FREELY DISTRIBUTABLE as long as this notice remains -'
  18.  
  19. /* If QuickSortPort not found then try to run setup.rexx */
  20.  
  21. IF ~SHOW('P','QuickSortPort') THEN CALL setup.rexx()
  22. IF ~SHOW('P','QuickSortPort') THEN EXIT 666
  23. IF SHOW('P','BBBBS') THEN
  24.   DO
  25.     SAY 'BBBBS is already running!'
  26.     EXIT 0
  27.   END
  28.  
  29. CALL OPENPORT('BBBBS')
  30. CALL SETCLIP('BBS_version',copyright.1)
  31. CALL SETCLIP('BBS_localfiles')
  32. CALL SETCLIP('BBS_localusers')
  33. CALL SETCLIP('BBS_interpret')
  34. CALL SETCLIP('BBS_maint')
  35. CALL SETCLIP('BBS_MESSAGE')
  36. CALL SETCLIP('BBS_BROWSE')
  37. CALL SETCLIP('BBS_MSGS')
  38. CALL SETCLIP('BBS_QUIT')
  39.  
  40. /* try to trap everything */
  41.  
  42. OPTIONS RESULTS
  43. OPTIONS FAILAT 999999
  44. NUMERIC DIGITS 14
  45. SIGNAL ON HALT
  46. SIGNAL ON SYNTAX
  47. SIGNAL ON FAILURE
  48. SIGNAL OFF BREAK_C
  49. SIGNAL OFF BREAK_E
  50.  
  51. PARSE VERSION . . cpu .
  52. cpu=RIGHT(cpu,2)/10
  53. IF cpu<1 THEN cpu=1
  54. Status Vers
  55. BB_VERS=RESULT
  56. bm=50
  57. IF RIGHT(BB_VERS,4)>1.59 THEN bm=25
  58.  
  59. dcd
  60. IF RC=0 THEN Send 'ATH1\r'
  61.  
  62. bbsprefs.=0  /* start with all prefs OFF */
  63. alpha.=''
  64. logonflag=1
  65. emailonline=-1
  66. CALL zerovars()
  67.  
  68.  
  69. /* User data structure by line */
  70.  
  71. text.=''
  72. text.1='   Full Name'
  73. text.2='      Street'
  74. text.3='City, ST Zip'
  75. text.4=' Voice Phone'
  76. text.5='    Password'
  77. text.6='    Protocol'
  78. text.7='LinesPerPage'
  79. text.8=' Preferences'
  80. text.9='    Computer'
  81. text.10='   Interests'
  82. text.11='Session Time'
  83. text.12='FirstSession'
  84. text.13='Last Session'
  85. text.14='      UpLoad'
  86. text.15='    Download'
  87. text.16='   Last File'
  88. text.17='Ratio  Email'
  89. text.18='    Winnings'
  90. text.19='       Usage'
  91. text.20='       Level'
  92. text.21='Exclude DIRS'
  93. text.22='   Msgs Read'
  94. text.23='   Msgs Writ'
  95. text.24=' Marked Msgs'
  96. text.25='Marked Files'
  97. text.26='QUICKexclude'
  98. text.27=' CBV numbers'
  99.  
  100.  
  101. name=''
  102. CR='0D'x
  103. LF='0A'x
  104.  
  105. SAY CR
  106. SAY CENTER(copyright.1,75)||CR
  107.  
  108. CALL PRAGMA('W','N')
  109. CALL config()
  110. IF bbsprefs.15~=0 THEN
  111.   CALL send2log('===== BBBBS started' DATE('W') DATE() TIME('C') '=====')
  112.  
  113. IF ~EXISTS(bbspath'Numbers/FirstLogon') THEN
  114.   ADDRESS COMMAND 'C:Date >'bbspath'Numbers/FirstLogon'
  115.  
  116. SAY CENTER(copyright.2,75)||CR
  117.  
  118. /* open printer? */
  119. IF bbsprefs.3 THEN
  120.   DO
  121.     IF ~OPEN(p,'PRT:','W') THEN
  122.       DO
  123.         CALL send2log('failed to open printer.')
  124.         bbsprefs.3=0
  125.       END
  126.   END
  127.  
  128. /* CALL PRAGMA('W','W')   <-- UN-COMMENT THIS LINE TO ENABLE REQUESTERS */
  129. CALL colors(1)
  130. Capture OFF
  131. Timeout 120
  132. SAY CENTER(copyright.3,75)||CR
  133.  
  134. excuses.=''
  135. courtesy=''
  136. courtesyflag=0
  137. SAY CENTER(copyright.4,75)||CR
  138. SAY CR
  139. SAY CR
  140. SAY '                      Setting up, please wait...'CR
  141. SAY CR
  142.  
  143. msg.=''
  144. IF readopen(bbspath'Lists/Conferences') THEN
  145.   DO
  146.     DO i=1
  147.       line=READLN(f)
  148.       IF line='END' THEN BREAK
  149.       IF EOF(f) THEN BREAK
  150.       num=WORD(line,1)
  151.       IF DATATYPE(num,'W') THEN msg.num=WORD(line,2)
  152.     END
  153.     CALL CLOSE(f)
  154.   END
  155.  
  156. dirs.=''
  157. IF readopen(bbspath'Lists/Libraries') THEN
  158.   DO
  159.     DO i=1
  160.       line=READLN(f)
  161.       IF line='END' | EOF(f) THEN LEAVE i
  162.       num=WORD(line,1)
  163.       IF DATATYPE(num,'W') THEN dirs.num=STRIP(WORD(line,2))
  164.     END
  165.     CALL CLOSE(f)
  166.   END
  167. CALL loaduserlist()
  168. SAY CR
  169. SAY '          The larger the BBS gets, the longer it takes to setup...'CR
  170. CALL loadfiles()
  171. dcd
  172. IF RC~=0 THEN
  173.   DO
  174.     SAY CR
  175.     SAY '      If it seems to take forever, ask the sysop to try' pen3'Resident'def 'mode.'CR
  176.   END
  177. SAY CR
  178. CALL set_grand()
  179. CALL loadalpha()
  180.  
  181. dcd
  182. IF RC=0 THEN
  183.   DO
  184.     logonflag=0
  185.     SIGNAL DONE
  186.   END
  187.  
  188. LOGON:
  189. CALL checkdcd()
  190. bps=0
  191. SetMark 'CONNECT'
  192. IF RC=1 THEN
  193.   DO
  194.     GetLine
  195.     connectline=RESULT
  196.     PARSE VAR connectline 'CONNECT'bps
  197.     CALL STRIP(bps)
  198.     DO i=3 WHILE DATATYPE(SUBSTR(bps,i,1),'N')
  199.     END
  200.     bps=LEFT(bps,i-1)
  201.   END
  202. IF bps<300 | bps>38400 THEN
  203.   DO
  204.     SetMark 'CARRIER'
  205.     IF RC=1 THEN
  206.       DO
  207.         GetLine
  208.         connectline=RESULT
  209.         PARSE VAR connectline 'CARRIER'bps
  210.         CALL STRIP(bps)
  211.       END
  212.     ELSE bps='000 '
  213.   END
  214. DO i=3 WHILE DATATYPE(SUBSTR(bps,i,1),'N')
  215. END
  216. bps=LEFT(bps,i-1)
  217. SIGNAL ON BREAK_C
  218. SIGNAL OFF BREAK_E
  219. REMOTE ON
  220. TimeOut 120
  221. IF bps<300 THEN bps=getbaudrate()
  222. IF bps>16800 THEN bps=getinput(1 0 'Please enter your modem to modem baudrate > ')
  223. IF bps<300 THEN SIGNAL DONE
  224. bps=bps%1
  225. IF logonflag=0 THEN
  226.   DO
  227.     logonflag=1
  228.     DO i=1 TO 7
  229.       SAY '  'CR
  230.     END
  231.     DO i=1 TO 4
  232.       SAY CENTER(copyright.i,75)||CR
  233.     END
  234.     CALL sound('LOGON')
  235.     CALL DELAY(150)
  236.     CALL colors(1)
  237.     SAY CR
  238.     SAY CR
  239.     SAY CR
  240.   END
  241.  
  242. IF alpha.0='' THEN CALL loadalpha()
  243.  
  244. CALL TIME('R')
  245.  
  246. /** Identify (title) message */
  247. IF EXISTS(bbspath'BBS_TEXT/HELLO') THEN
  248.   DO
  249.     nonstop=1
  250.     arg=bbspath'BBS_TEXT/HELLO'
  251.     CALL readlines(arg 1)
  252.     CALL seelines(0)
  253.     nonstop=0
  254.   END
  255. SAY CR
  256.  
  257. SAY 'Running on' BB_VERS 'at' bps 'baud. ' TIME('C') DATE('W') DATE()||CR
  258. Stat 'Z'
  259. CALL checkdcd()
  260.  
  261. /* Ask for name */
  262. name=''
  263. courtesy=''
  264. Queue CR
  265. DO count=1 TO 3
  266.   name=getinput(1 0 'Please enter name: ')
  267.   name=cleanstring(1':'name)
  268.   IF name='NEW' THEN LEAVE count
  269.   IF name~='' THEN
  270.     DO
  271.       IF FIND(userlist,name)>0 THEN LEAVE count
  272.       IF FIND(exclusion,name)>0 THEN
  273.         DO
  274.           SAY 'Sorry, that is a reserved name.'CR
  275.           name=''
  276.           ITERATE count
  277.         END
  278.       CALL loadcourtesy()
  279.       IF bbsprefs.7>0 | FIND(courtesy,name)>0 THEN
  280.         DO
  281.           SAY CR
  282.           SAY 'Welcome' name'!'CR
  283.           SAY 'You will be automatically validated after you enter your user info.'CR
  284.           SAY CR
  285.           LEAVE count
  286.         END
  287.     END
  288.   IF count<3 THEN
  289.     DO
  290.       IF STRIP(name)~='' THEN SAY name 'not found.  Please try again.'CR
  291.       SAY 'New Users enter NEW to apply for validation.'CR
  292.     END
  293. END
  294. IF count>3 THEN SIGNAL DONE
  295. CALL TIME('R')
  296. logontime=TIME('C')
  297. line=left(name,16,' ') 'logged in  at' time('C') date('W') date() 'at' bps 'baud'
  298. CALL send2log(line)
  299. CALL checkUser()
  300. IF UPPER(WORD(data.12,3))~='BIRTHDAY:' THEN
  301.   DO
  302.     SAY CR
  303.     SAY 'Please help us out by entering the following information.'CR
  304.     CALL getbirth()
  305.     SAY '   Thank you!'CR
  306.   END
  307. prevcaller=''
  308. prevcaller=GETCLIP('BBS_lastcaller')
  309. IF prevcaller~='' THEN CALL SETCLIP('BBS_prevcaller',prevcaller)
  310. city=docity(data.3)
  311. CALL SETCLIP('BBS_lastcaller',name city'  'TIME('C') DATE())
  312. CALL SETCLIP('BBS_level',level)
  313. CALL postuser(0)
  314. Timeout maxidle         /* max idle time at prompts */
  315.  
  316. IF RIGHT(WORD(data.12,4),4)=RIGHT(DATE('S'),4) THEN
  317.   DO
  318.     arg=bbspath'BBS_TEXT/BIRTHDAY'
  319.     IF EXISTS(arg) THEN 
  320.       DO
  321.         SAY CR
  322.         CALL showtext(arg)
  323.       END
  324.     SAY CR
  325.     SAY '***  Happy Birthday,' pen3||data.1||def', and many more!  ***'CR
  326.     SAY CR
  327.   END
  328. SAY CR
  329.  
  330. /* Get current protocol */
  331. Status Trans
  332. protocol=STRIP(RESULT)
  333.  
  334. IF bbsLOGON.baud(name level)=1 THEN SIGNAL OUT
  335. CALL checkdcd()
  336. CALL sortlibraries()
  337. IF FIND(data.8,'QUICK')>0 THEN
  338.   DO
  339.     logonflag=0
  340.     CALL do_quick(0)
  341.     logonflag=1
  342.   END
  343.  
  344. /*
  345. Opening Display after logon. Seen by all Users ONCE A DAY. It first
  346. looks for a unique yearly data (ie, WELCOME.0704), then daily data
  347. (ie, WELCOME.Fri), and finally a simple, everyday 'WELCOME' datafile
  348. */
  349.  
  350. IF DATE('I')>lastondate THEN
  351.   DO
  352.     SAY CR
  353.     arg=bbspath'BBS_TEXT/WELCOME.'RIGHT(DATE('S'),4)
  354.     IF EXISTS(arg) THEN CALL showtext(arg)
  355.     SAY CR
  356.     arg=bbspath'BBS_TEXT/WELCOME.'LEFT(DATE('W'),3)
  357.     IF EXISTS(arg) THEN CALL showtext(arg)
  358.     SAY CR
  359.     arg=bbspath'BBS_TEXT/WELCOME'
  360.     IF EXISTS(arg) THEN CALL showtext(arg)
  361.  
  362. /*
  363. Looks for format UNTIL.YYYYMMDD ie, "UNTIL.19920514"
  364. Deletes any that are previous to "today"
  365. */
  366.  
  367.     untils.=''
  368.     IF FileList(bbspath'BBS_TEXT/UNTIL.*',untils)>0 THEN
  369.       DO
  370.         CALL QSORT(1,untils.0,untils)
  371.         DO ui=1 TO untils.0
  372.           IF RIGHT(untils.ui,8)<DATE('S') THEN CALL DELETE(untils.ui)
  373.           ELSE
  374.             DO
  375.               SAY CR
  376.               CALL showtext(untils.ui)
  377.             END
  378.         END
  379.       END
  380.     DROP untils.
  381.   END
  382.  
  383. IF bbsprefs.1 & ~terseflag THEN
  384.   DO
  385.     IF doGrin()>3 THEN CALL waiting()
  386.     IF EXISTS(bbspath'rexxDoors/Moon.rexx') THEN CALL Moon.rexx()
  387.     IF EXISTS(bbspath'rexxDoors/Time.rexx') THEN CALL Time.rexx()
  388.     IF FIND(UPPER(SHOWLIST('A')),'TODAY')>0 THEN
  389.       DO
  390.         IF EXISTS('RAM:TODAY') THEN
  391.           DO
  392.             finfo=STATEF('RAM:TODAY')
  393.             IF WORD(finfo,5)~=DATE('I') THEN
  394.               ADDRESS COMMAND 'C:Today091 >RAM:TODAY'
  395.           END
  396.         ELSE ADDRESS COMMAND 'C:Today091 >RAM:TODAY'
  397.         IF EXISTS('RAM:TODAY') THEN
  398.           DO
  399.             CALL readlines('RAM:TODAY' 1)
  400.             CALL seelines(0)
  401.           END
  402.       END
  403.     SAY CR
  404.   END
  405.  
  406. CALL readmail(0)
  407. IF ~terseflag THEN
  408.   DO
  409.     IF level>sysoplevel THEN
  410.       DO
  411.         lstmail=WORD(data.17,3)
  412.         IF ~DATATYPE(lstmail,'W') THEN lstmail=0
  413.         IF countcheck(bbspath'Numbers/LastMail' 0)>lstmail THEN
  414.           IF getinput(1 1 'Check Email? (Ny) > ')='Y' THEN CALL mailreport()
  415.         IF level<99 THEN
  416.           DO
  417.             SAY CR
  418.             CALL showtext(bbspath'Email/'sysop'/NEW_FILES')
  419.           END
  420.         SAY CR
  421.         CALL showtext(bbspath'Lists/NEW_USERS')
  422.         CALL showtext(bbspath'Lists/CBV_USERS')
  423.       END
  424.     CALL logonstats()
  425.     CALL newinfo()
  426.   END
  427. CALL showmarked(1)
  428. CALL setdir(libpath||dirs.1)
  429. logonflag=0
  430.  
  431.  
  432. /***** MAIN *****/
  433.  
  434. IF menu~='ALL' THEN menu='MAIN'
  435.  
  436. RESTART:
  437. IF name='' | data.20='' | logonflag THEN SIGNAL LOGON  /* login was interrupted */
  438. SIGNAL ON BREAK_C
  439. SIGNAL ON BREAK_E
  440.  
  441. waitchar=''
  442. string=''
  443. opt=''
  444. IF level<1 THEN menu='NEW'
  445. DO WHILE(opt~='G')
  446.   go=0
  447.   DO WHILE(~go)
  448.     IF waitchar='' | waitchar='?' THEN
  449.       DO
  450.         commands='cghiqrsvwxyz!#,'
  451.         IF level>0  THEN commands='abcdefghijlmnoprstuvwxyz!$#&+,.'
  452.         IF level>sysoplevel THEN commands=commands'k%^()=;'
  453.         IF level=99 THEN commands=commands'@~'
  454.         commands=commands'?'
  455.         IF menuflag | waitchar='?' | string='?' THEN CALL menus()
  456.         ELSE SAY pen3'COMMANDS:'def commands||CR
  457.         opt='MENU'
  458.         arg=''
  459.         CALL postuser(1)
  460.       END
  461.     CALL showtime()
  462.     line=''
  463.     line=line||bak2' 'TIME('C')' 'def
  464.     IF menu='ALL' | menu='FILE' THEN
  465.       line=line pen3'FILE_LIBRARY:'plaindir||def
  466.     ELSE IF menu='MSG' THEN line=line pen3'MESSAGES:'def
  467.     ELSE line=line pen3'MAIN:'def
  468.     line=line'  'bbsname
  469.     IF waitchar='' THEN waitchar=getinput(0 0 line' > ')
  470.     PARSE VAR waitchar string' 'arg
  471.     CALL checkdcd()
  472.     nonstop=0
  473.     string=UPPER(STRIP(string))
  474.     IF POS('+++',string)>0 THEN SIGNAL OUT
  475.     IF string='OFF' | string='BYE' THEN SIGNAL LOGOUT2
  476.     IF string='FL' & level>0 THEN CALL Friends()
  477.     CALL checkalias()
  478.     waitchar=''
  479.     warnings=0
  480.     IF DATATYPE(string,'W') THEN
  481.       DO
  482.         IF string>level THEN
  483.           DO
  484.             arg=STRIP(string arg)
  485.             string='D'
  486.           END
  487.         ELSE
  488.           DO
  489.             dirnum=string
  490.             CALL chdir2()
  491.             CALL since()
  492.           END
  493.       END
  494.     IF string='QUICK' & level>0 THEN CALL do_quick(1)
  495.     opt=left(string,1)
  496.     IF opt='G' THEN
  497.       DO
  498.         IF getinput(1 1 pen3'Logoff? (nY) > 'def)='N' THEN opt='?'
  499.       END
  500.     go=1    /* check for access */
  501.     IF POS(opt,UPPER(commands))=0 THEN go=0
  502.   END
  503.   IF CBVflag=1 THEN SIGNAL OUT
  504.   CALL postuser(1)
  505.   OPTIONS PROMPT 'Filename: '
  506.   SELECT
  507.     WHEN opt='A' THEN CALL showalpha()
  508.     WHEN opt='B' THEN CALL browse()
  509.     WHEN opt='C' THEN CALL editor('MAIL' sysop)
  510.     WHEN opt='D' THEN CALL dload()
  511.     WHEN opt='E' THEN CALL readmail(1)
  512.     WHEN opt='F' THEN CALL do_F()
  513.     WHEN opt='H' THEN CALL help('MAIN')
  514.     WHEN opt='I' THEN CALL information()
  515.     WHEN opt='J' THEN CALL jump2rexx()
  516.     WHEN opt='K' THEN CALL killuser()
  517.     WHEN opt='L' THEN CALL list()
  518.     WHEN opt='M' THEN IF menu~='ALL' THEN menu='MSG'
  519.     WHEN opt='N' THEN CALL newfiles()
  520.     WHEN opt='O' THEN CALL otheruser()
  521.     WHEN opt='P' THEN CALL editor('MSG')
  522.     WHEN opt='R' THEN IF menu='NEW' THEN CALL CBV();ELSE CALL readmessages()
  523.     WHEN opt='S' THEN CALL bbsSEARCH()
  524.     WHEN opt='T' THEN CALL chpro()
  525.     WHEN opt='U' THEN CALL uload(1)
  526.     WHEN opt='V' THEN CALL showtext(bbspath'Usage/USER.LOG')
  527.     WHEN opt='W' THEN CALL showuserlist()
  528.     WHEN opt='X' THEN CALL switchmenuflag()
  529.     WHEN opt='Y' THEN CALL edituser()
  530.     WHEN opt='Z' THEN CALL counts()
  531.     WHEN opt='~' THEN CALL sysED(1)
  532.     WHEN opt='!' THEN CALL yell()
  533.     WHEN opt='@' THEN CALL shell()
  534.     WHEN opt='#' THEN CALL switchcolors()
  535.     WHEN opt='$' THEN IF menu='ALL' THEN menu='MAIN'; ELSE menu='ALL'
  536.     WHEN opt='%' THEN CALL editnote()
  537.     WHEN opt='^' THEN CALL readlogs()
  538.     WHEN opt='&' THEN CALL profiles(1)
  539.     WHEN opt='+' THEN CALL ext_dload()
  540.     WHEN opt='(' THEN CALL filereport()
  541.     WHEN opt=')' THEN CALL mailreport()
  542.     WHEN opt='=' THEN CALL levelreport()
  543.     WHEN opt=';' THEN CALL changename()
  544.     WHEN opt=',' THEN DO;CALL hourly();CALL waiting();END
  545.     WHEN opt='.' THEN IF menu~='ALL' THEN menu='MAIN'
  546.     WHEN opt='?' THEN IF menuflag THEN CALL help('MAIN')
  547.     OTHERWISE NOP
  548.   END
  549. END
  550. SIGNAL LOGOUT
  551. EXIT
  552.  
  553.  
  554.  
  555. /* FUNCTIONS */
  556.  
  557.  
  558. do_F:
  559. IF menu='FILE' | menu='ALL' THEN
  560.   DO
  561.     IF STORAGE()<(bbsprefs.15+100000) | GETCLIP('BBS_libs.0')~='' THEN
  562.       DO
  563.         SAY CR
  564.         SAY 'Sorry! Not enough memory left for background archiving.'CR
  565.         SAY 'Please try again in 10 minutes or so.'CR
  566.         SAY CR
  567.         RETURN
  568.       END
  569.     DO i=0 TO libs.0
  570.       CALL SETCLIP('BBS_libs.'i,libs.i)
  571.     END
  572.     IF Make_BrowseList.baud(name colorflag files.0)=0 THEN
  573.       DO
  574.         CALL send2log('Arc: Make_BrowseList.baud')
  575.         IF emailonline>=0 THEN emailonline=emailonline+1
  576.       END
  577.     DO i=0 TO libs.0
  578.       CALL SETCLIP('BBS_libs.'i)
  579.     END
  580.   END
  581. ELSE IF menu~='ALL' THEN menu='FILE'
  582. RETURN
  583.  
  584.  
  585. cleanstring:
  586. PARSE ARG nflag':'cstr
  587. bot=TRIM(XRANGE(,' '))
  588. bot=COMPRESS(bot,'1B'x)  /* ESC for ANSI */
  589. top=XRANGE('7F'x)
  590. IF nflag=1 THEN
  591.   DO
  592.     bot=bot||XRANGE('!','@')'[\]`~{:}'
  593.     cstr=TRANSLATE(UPPER(cstr),' ','_')
  594.   END
  595. cstr=COMPRESS(cstr,bot||top)
  596. IF nflag~=2 THEN cstr=STRIP(cstr)
  597. IF nflag=1 THEN cstr=SPACE(cstr,1,'_')
  598. RETURN cstr
  599.  
  600.  
  601. showtext:
  602. PARSE ARG arg .
  603. IF EXISTS(arg) THEN
  604.   DO
  605.     CALL readlines(arg 1)
  606.     CALL seelines(1)
  607.     nonstop=0
  608.     CALL waiting()
  609.   END
  610. RETURN
  611.  
  612.  
  613. doGrin:
  614. IF ~EXISTS(bbspath'rexxDoors/Grin_du_Jour.rexx') THEN RETURN 0
  615. CALL setdir(bbspath'rexxDoors')
  616. temp=Grin_du_Jour.rexx()
  617. SAY CR
  618. RETURN temp
  619.  
  620.  
  621. send2log:
  622. PARSE ARG sendline
  623. logfile=bbspath'Logs/log.'DATE('S')    /* daily logs */
  624. IF ~OPEN('log',logfile,'A') THEN
  625.   DO
  626.     IF ~OPEN('log',logfile,'W') THEN
  627.       DO
  628.         SAY 'failed to open log file'
  629.         SIGNAL DONE
  630.      END
  631.   END
  632. CALL WRITELN('log',sendline)
  633. CALL CLOSE('log')
  634. IF bbsprefs.3=1 THEN CALL WRITELN(p,sendline)
  635. RETURN
  636.  
  637.  
  638. send2last:
  639. PARSE ARG sendline
  640. IF bbsprefs.24~=1 & name=sysop THEN RETURN
  641. lynes.=''
  642. lynes.0=2
  643. lynes.1='        -'pen3 bbsname def'user log for the last 99 calls -'
  644. lynes.2=sendline
  645. logfile=bbspath'USAGE/USER.LOG'  /* simple usage log */
  646. IF EXISTS(logfile) THEN
  647.   DO
  648.     x=OPEN(lu,logfile,'R')
  649.     IF x=0 THEN RETURN
  650.     CALL READLN(lu)
  651.     DO i=3 TO 99
  652.       sendline=READLN(lu)
  653.       IF EOF(lu) THEN LEAVE i
  654.       lynes.i=sendline
  655.     END
  656.     CALL CLOSE(lu)
  657.     IF i>99 THEN lynes.0=99
  658.     ELSE lynes.0=i-1
  659.   END
  660. x=OPEN(lu,logfile,'W')
  661. IF x=0 THEN RETURN
  662. DO i=1 TO lynes.0
  663.   CALL WRITELN(lu,lynes.i)
  664. END
  665. CALL CLOSE(lu)
  666. RETURN
  667.  
  668.  
  669. do_quick:
  670. ARG flag .
  671. IF FIND(UPPER(data.8),'QUICK')=0 THEN
  672.   DO
  673.     SAY CR
  674.     SAY 'The QUICK option is OFF in your current settings.'CR
  675.     SAY CR
  676.     SAY 'Setting the QUICK option to ON will allow you to tell the BBS to'CR
  677.     SAY 'make a .lha archive of all new bbs activity since your last call.'CR
  678.     SAY CR
  679.     SAY 'This archive can then be read (and replied to, and files can be'CR
  680.     SAY 'uploaded and downloaded) using 'pen3'bbsQUICK.rexx'def', the offline read/reply'CR
  681.     SAY 'module for BBBBS, which is available here in the file libraries.'CR
  682.     SAY CR
  683.     IF getinput(1 1 'Turn the QUICK option ON? (Ny) >')~='Y' THEN RETURN
  684.     data.8=data.8 'QUICK'
  685.     CALL saveData(0)
  686.   END
  687. ELSE IF flag=1 THEN
  688.   DO
  689.     IF getinput(1 1 'Turn the QUICK option OFF? (Ny) > ')='Y' THEN
  690.       DO 
  691.         temp=data.8
  692.         data.8=''
  693.         DO i=1 TO WORDS(temp)
  694.           IF WORD(temp,i)~='QUICK' THEN data.8=STRIP(data.8 WORD(temp,i))
  695.         END
  696.         ADDRESS COMMAND 'c:delete' bbspath'EmailFiles/'name'/QUICK_#?'
  697.         RETURN
  698.       END
  699.   END
  700. IF getinput(1 1 'Edit your QUICK exclude list? (Ny) > ')='Y' THEN
  701.   DO
  702.     SAY CR
  703.     SAY 'You may EXCLUDE any of these from your QUICK archives.'CR
  704.     SAY pen3||LEFT('-',74,'-')||def||CR
  705.     temp=LEFT(' ',7)
  706.     SAY temp'HELLO          - Pre-logon message.'CR
  707.     SAY temp'WELCOME        - Post-logon message.'CR
  708.     SAY temp'GOODBYE        - Logoff message.'CR
  709.     SAY temp'HOURLY         - Average-Minutes-Per-Hour usage graph.'CR
  710.     SAY temp'STATS.BBS      - Most of the Z command from the main menu.'CR
  711.     SAY temp'filename       - ANY filename in the Information area.'CR
  712.     SAY temp'MESSAGES       - New conference messages.'CR
  713.     SAY temp'FILELIST       - New file descriptions.'CR
  714.     SAY pen3||LEFT('-',74,'-')||def||CR
  715.     SAY 'Enter a space separated list of what you wish to exclude.'CR
  716.     SAY pen3'Exclude:'def data.26||CR
  717.     temp=getinput(1 0 pen3'Exclude: 'def)
  718.     IF temp='' & data.26~='' THEN
  719.       DO
  720.         IF getinput(1 1 'Clear the QUICK exclude list? (nY) > ')~='N' THEN
  721.           data.26=''
  722.       END
  723.     ELSE data.26=temp
  724.     temp='Your QUICK archives will exclude'pen3
  725.     IF data.26='' THEN temp=temp 'nothing!'
  726.     ELSE temp=temp data.26
  727.     SAY temp||def||CR
  728.     CALL saveData(0)
  729.     SAY CR
  730.   END
  731. IF GETCLIP('BBS_'name)~='' THEN
  732.   DO
  733.     SAY CR
  734.     SAY 'The QUICK routines are still working on your archive...'CR
  735.     SAY 'Please try again later.'CR
  736.     SAY CR
  737.     RETURN
  738.   END
  739. quickdir=bbspath'EmailFiles/'name
  740. CALL MAKEDIR(quickdir)
  741. CALL setdir(quickdir)
  742. IF getinput(1 1 'Do you have a QUICKIN file to upload? (Ny) > ')='Y' THEN
  743.   DO
  744.     arg='QUICKIN.lha'
  745.     ul=2
  746.     DO WHILE ul=2
  747.       ul=uload(0)
  748.     END
  749.   END
  750. IF EXISTS(bbspath'EmailFiles/'name'/QUICKIN.lha') & level>=sysoplevel THEN
  751.   IF getinput(1 1 'Process your QUICKIN archive [N]ow or at [L]ogoff? (Ln) > ')='N' THEN
  752.     DO
  753.       ADDRESS AREXX bbsQUICKIN.rexx name level sysoplevel bbsprefs.6
  754.       SAY CR
  755.       SAY 'Processing QUICKIN archive...'CR
  756.       SAY CR
  757.     END
  758. IF GETCLIP('BBS_'name)='QUICK' THEN
  759.   DO
  760.     SAY CR
  761.     SAY 'The QUICK routines are still working on your file(s)...'CR
  762.     SAY CR
  763.     RETURN
  764.   END
  765. arg='RAM:dirlist'
  766. ADDRESS COMMAND 'C:list >'arg quickdir'/QUICK_#? DATES'
  767. IF WORD(STATEF(arg),2)>80 THEN
  768.   DO
  769.     CALL readlines(arg 1)
  770.     CALL seelines(0)
  771.     SAY CR
  772.   END
  773. efiles=UPPER(SHOWDIR(quickdir))
  774. DO qi=1 TO WORDS(efiles)
  775.   qarg=WORD(efiles,qi)
  776.   IF LEFT(qarg,6)='QUICK_' & RIGHT(qarg,4)='.LHA' THEN
  777.     DO
  778.       SAY qarg 'is' WORD(STATEF(qarg),2) 'bytes.'CR
  779.       allargs=qarg
  780.       DO WHILE dload2()=1
  781.       END
  782.       t=''
  783.       DO WHILE t~='N' & t~='Y'
  784.         t=getinput(1 1 'Delete' qarg'? (ny) > ')
  785.       END
  786.       IF t='Y' THEN
  787.         DO
  788.           IF DELETE(quickdir'/'qarg)=1 THEN SAY qarg 'deleted.'CR
  789.           CALL DELETE(quickdir'/'qarg'.xdl')
  790.           qarg=COMPRESS(UPPER(qarg),'QUICK_.LHA')
  791.           CALL DELETE(bbspath'Email/'name'/BBBBS.'qarg)
  792.         END
  793.     END
  794. END
  795. arg=''
  796. SAY CR
  797. IF GETCLIP('BBS_'name)~='' THEN RETURN
  798. IF getinput(1 1 'Archive new BBS activity now? (Ny) > ')='Y' THEN
  799.   DO
  800.     CALL SETCLIP('BBS_city',city)
  801.     CALL SETCLIP('BBS_'name'_26',data.26)
  802.     IF FIND(UPPER(data.26),'STATS.BBS')=0 THEN
  803.       CALL SETCLIP('BBS_statsarg',emailonline grand grand2 files.0)
  804.     IF FIND(UPPER(data.26),'MESSAGES')=0 THEN
  805.       CALL SETCLIP('BBS_'name'_22',data.22)
  806.     CALL MAKEDIR(bbspath'EmailFiles/'name)
  807.     CALL showmarked(0)
  808.     ADDRESS AREXX bbsQUICKOUT.rexx name level lastbrowse WORD(data.16,2) data.21
  809.     CALL send2log('Started QUICKOUT at' TIME('C'))
  810.     SAY CR
  811.     IF FIND(UPPER(data.26),'MESSAGES')=0 THEN
  812.       DO
  813.         clear_marked=1
  814.         DO i=1 TO level
  815.           IF WORD(data.22,i)~=-1 THEN
  816.             lastread.i=countcheck(bbspath'Numbers/LastMessage'i 0)
  817.         END
  818.         SAY CR
  819.       END
  820.     IF FIND(UPPER(data.26),'FILELIST')=0 THEN
  821.       lastbrowse=countcheck(bbspath'Numbers/LastFile' 0)
  822.     newfilesdate=DATE('S') TIME()
  823.     IF writeopen(bbspath'EmailFiles/'name'/Libraries') THEN
  824.       DO
  825.         DO i=1 TO libs.0
  826.           CALL WRITELN(f,libs.i)
  827.         END
  828.         CALL CLOSE(f)
  829.       END
  830.     IF writeopen(bbspath'EmailFiles/'name'/Conferences') THEN
  831.       DO
  832.         DO i=1 TO msgs.0
  833.           CALL WRITELN(f,msgs.i)
  834.         END
  835.         CALL CLOSE(f)
  836.       END
  837.     SAY CR
  838.     IF getinput(1 1 'Logoff Now? (nY) > ')~='N' THEN
  839.       DO
  840.         SAY 'Your archive will be waiting next time you call...'CR
  841.         SAY CR
  842.         SIGNAL LOGOUT2
  843.       END
  844.     SAY CR
  845.     SAY 'Note: You now have no ''new'' files or messages (they are being archived).'CR
  846.     SAY CR
  847.     SAY 'You will be signaled if you are still online when your archive is ready...'CR
  848.     SAY CR
  849.     CALL saveData(1)
  850.     CALL waiting()
  851.   END
  852. ELSE
  853.   DO
  854.     SAY CR
  855.     IF getinput(1 1 'Logoff Now? (nY) > ')~='N' THEN SIGNAL LOGOUT2
  856.   END
  857. SAY CR
  858. CALL setdir(libpath||dirs.1)
  859. RETURN
  860.  
  861.  
  862. killuser:
  863. IF level<=sysoplevel THEN RETURN
  864. killcount=0
  865. DO loop=1
  866.   IF arg='' THEN
  867.     DO
  868.       OPTIONS PROMPT 'RETURN=QUIT  Username to Kill: '
  869.       PULL arg
  870.     END
  871.   IF STRIP(arg)='' THEN LEAVE loop
  872.   arg=UPPER(arg)
  873.   arg=SPACE(STRIP(arg),1,'_')
  874.   IF getinput(1 1 'Really kill' arg'? (nY) > ')='N' THEN
  875.     DO
  876.       arg=''
  877.       ITERATE loop
  878.     END
  879.   SAY 'Working...'lineup||CR
  880.   IF readlines(bbspath'Users/'arg 1) THEN
  881.     DO
  882.       SAY 'User' arg 'not found.'CR
  883.       arg=''
  884.       ITERATE loop
  885.     END
  886.   IF level<=lynes.20 THEN
  887.     DO
  888.       SAY '*** Tsk! Tsk!  Your level is not greater than' arg'.'CR
  889.       CALL send2log('Tried to kill:' arg)
  890.       arg=''
  891.       ITERATE loop
  892.     END
  893.   CALL DELETE(bbspath'Users/'arg)
  894.   IF EXISTS(bbspath'Email/'arg) THEN
  895.     DO
  896.       temp=WORDS(SHOWDIR(bbspath'Email/'arg))
  897.       emailonline=emailonline-temp
  898.       ADDRESS COMMAND 'C:DELETE >*' bbspath'Email/'arg 'ALL'
  899.     END
  900.   IF EXISTS(bbspath'EmailFiles/'arg) THEN
  901.     ADDRESS COMMAND 'C:DELETE >*' bbspath'EmailFiles/'arg 'ALL'
  902.   CALL send2log('Killed:' arg)
  903.   SAY CR'User file, Email & EmailFiles for' arg 'have been deleted.'CR
  904.   killcount=killcount+1
  905.   arg=''
  906. END
  907. IF killcount=0 THEN RETURN
  908. CALL DELETE(bbspath'Lists/USERS')
  909. sortuserflag=1
  910. RETURN
  911.  
  912.  
  913. menus:
  914. CALL checkdcd()
  915. SAY CR
  916. IF menu='NEW' THEN
  917.   DO
  918.     SAY pen6'     _________________'def||CR
  919.     SAY pen6'  __/  'pen3'New User Menu'pen6'  \___'def||CR
  920.     SAY pen6' |                        |'def||CR
  921.     SAY pen6' |'def'   ['pen3'H'def']elp               'pen6'|'def||CR
  922.     SAY pen6' |'def'   ['pen3'I'def']nformation        'pen6'|'def||CR
  923.     SAY pen6' |'def'   ['pen3'Y'def']our user data     'pen6'|'def||CR
  924.     SAY pen6' |'def'   ['pen3'W'def']ho is here        'pen6'|'def||CR
  925.     SAY pen6' |'def'   ['pen3'S'def']earch user list   'pen6'|'def||CR
  926.     SAY pen6' |'def'   ['pen3'V'def']iew user log      'pen6'|'def||CR
  927.     SAY pen6' |'def'   ['pen3'Z'def'] bbs statistics   'pen6'|'def||CR
  928.     SAY pen6' |'def'   ['pen3','def'] hourly stats     'pen6'|'def||CR
  929.     SAY pen6' |'def'   ['pen3'X'def'] toggle menus     'pen6'|'def||CR
  930.     SAY pen6' |'def'   ['pen3'#'def'] toggle color     'pen6'|'def||CR
  931.     SAY pen6' |'def'   ['pen3'!'def'] YELL for SYSOP   'pen6'|'def||CR
  932.     SAY pen6' |'def'   ['pen3'C'def']omment to SYSOP   'pen6'|'def||CR
  933.     SAY pen6' |'def'   ['pen3'G'def']oodbye (hangup)   'pen6'|'def||CR
  934.     SAY pen6' |________________________|'def||CR
  935.  IF bbsprefs.22~=0 THEN
  936.    DO
  937.     SAY CR
  938.     SAY 'Local Callers may register and receive' pen7'INSTANT VALIDATION'def'!'CR
  939.     SAY 'Enter R to ['pen3'R'def']egister using Call Back Verify.'CR
  940.    END
  941.   END
  942. ELSE IF menu='MSG' THEN
  943.   DO
  944.     SAY pen6'       ____________'def||CR
  945.     SAY pen6'  ____/  'pen3'Messages'pen6'  \_____'def||CR
  946.     SAY pen6' |                       |'def||CR
  947.     SAY pen6' |'def'   ['pen3'H'def']elp              'pen6'|'def||CR
  948.     SAY pen6' |'def'   ['pen3'P'def']ost messages     'pen6'|'def||CR
  949.     SAY pen6' |'def'   ['pen3'R'def']ead messages     'pen6'|'def||CR
  950.     SAY pen6' |'def'   ['pen3'S'def']earch messages   'pen6'|'def||CR
  951.     SAY pen6' |'def'   ['pen3'E'def']mail (private)   'pen6'|'def||CR
  952.     SAY pen6' |'def'   ['pen3'C'def']omment to SYSOP  'pen6'|'def||CR
  953.     SAY pen6' |'def'   ['pen3'QUICK'def'] options     'pen6'|'def||CR
  954.     SAY pen6' |'def'   ['pen3'FL'def'] Friends List   'pen6'|'def||CR
  955.     SAY pen6' |'def'   ['pen3'!'def'] YELL for SYSOP  'pen6'|'def||CR
  956. IF(level>sysoplevel) THEN DO
  957.     SAY pen6' |'def'   ['pen3'^'def'] view BBS logs   'pen6'|'def||CR
  958.     SAY pen6' |'def'   ['pen3')'def'] email report    'pen6'|'def||CR
  959.     SAY pen6' |'def'   ['pen3'='def'] level report    'pen6'|'def||CR
  960.     SAY pen6' |'def'   ['pen3';'def'] change username 'pen6'|'def||CR;END
  961. IF(level=99) THEN DO
  962.     SAY pen6' |'def'   ['pen3'~'def'] online editor   'pen6'|'def||CR
  963.     SAY pen6' |'def'   ['pen3'@'def'] dos shell       'pen6'|'def||CR;END
  964.     SAY pen6' |'def'   ['pen3'F'def']iles menu        'pen6'|'def||CR
  965.     SAY pen6' |'def'   ['pen3'.'def'] main menu       'pen6'|'def||CR
  966.     SAY pen6' |_______________________|'def||CR
  967.   END
  968. ELSE IF menu='FILE' THEN
  969.   DO
  970.     SAY pen6'         _________'def||CR
  971.     SAY pen6'  ______/  'pen3'Files'pen6'  \_______'def||CR
  972.     SAY pen6' |                        |'def||CR
  973.     SAY pen6' |'def'   ['pen3'A'def']lphabetic list    'pen6'|'def||CR
  974.     SAY pen6' |'def'   ['pen3'H'def']elp               'pen6'|'def||CR
  975.     SAY pen6' |'def'   ['pen3'B'def']rowse filenotes   'pen6'|'def||CR
  976.     SAY pen6' |'def'   ['pen3'N'def']ew files list     'pen6'|'def||CR
  977.     SAY pen6' |'def'   ['pen3'L'def']ist by Library    'pen6'|'def||CR
  978.     SAY pen6' |'def'   ['pen3'F'def']ilelist archives  'pen6'|'def||CR
  979.     SAY pen6' |'def'   ['pen3'S'def']earch files       'pen6'|'def||CR
  980.     SAY pen6' |'def'   ['pen3'U'def']pload             'pen6'|'def||CR
  981.     SAY pen6' |'def'   ['pen3'D'def']ownload           'pen6'|'def||CR
  982.     SAY pen6' |'def'   ['pen3'T'def']ransfer protocol  'pen6'|'def||CR
  983.     SAY pen6' |'def'   ['pen3'+'def'] Extra Devices    'pen6'|'def||CR
  984. IF(level>sysoplevel) THEN DO
  985.     SAY pen6' |'def'   ['pen3'K'def']ill a user        'pen6'|'def||CR
  986.     SAY pen6' |'def'   ['pen3'%'def'] edit filenote    'pen6'|'def||CR
  987.     SAY pen6' |'def'   ['pen3'('def'] file report      'pen6'|'def||CR
  988.     SAY pen6' |'def'   ['pen3';'def'] change username  'pen6'|'def||CR;END
  989. IF(level=99) THEN DO
  990.     SAY pen6' |'def'   ['pen3'@'def'] dos shell        'pen6'|'def||CR;END
  991.     SAY pen6' |'def'   ['pen3'M'def']essages menu      'pen6'|'def||CR
  992.     SAY pen6' |'def'   ['pen3'.'def'] main menu        'pen6'|'def||CR
  993.     SAY pen6' |________________________|'def||CR
  994.   END
  995. ELSE IF menu='MAIN' THEN
  996.   DO
  997.     SAY pen6'       _____________'def||CR
  998.     SAY pen6'  ____/  'pen3'Main Menu'pen6'  \_____'def||CR
  999.     SAY pen6' |                        |'def||CR
  1000.     SAY pen6' |'def'   ['pen3'H'def']elp               'pen6'|'def||CR
  1001.     SAY pen6' |'def'   ['pen3'I'def']nfomation         'pen6'|'def||CR
  1002.     SAY pen6' |'def'   ['pen3'J'def']ump to doorways   'pen6'|'def||CR
  1003.     SAY pen6' |'def'   ['pen3'Y'def']our user data     'pen6'|'def||CR
  1004.     SAY pen6' |'def'   ['pen3'W'def']ho is here list   'pen6'|'def||CR
  1005.     SAY pen6' |'def'   ['pen3'S'def']earch userlist    'pen6'|'def||CR
  1006.     SAY pen6' |'def'   ['pen3'O'def']ther users info   'pen6'|'def||CR
  1007.     SAY pen6' |'def'   ['pen3'V'def']iew user log      'pen6'|'def||CR
  1008.     SAY pen6' |'def'   ['pen3'X'def']pert (no menus)   'pen6'|'def||CR
  1009.     SAY pen6' |'def'   ['pen3'#'def'] toggle colors    'pen6'|'def||CR
  1010.     SAY pen6' |'def'   ['pen3'$'def'] toggle menu(s)   'pen6'|'def||CR
  1011.     SAY pen6' |'def'   ['pen3'&'def'] user profiles    'pen6'|'def||CR
  1012.     SAY pen6' |'def'   ['pen3'Z'def'] bbs statistics   'pen6'|'def||CR
  1013.     SAY pen6' |'def'   ['pen3','def'] hourly stats     'pen6'|'def||CR
  1014.     SAY pen6' |'def'   ['pen3'G'def']oodbye (hangup)   'pen6'|'def||CR
  1015.     SAY pen6' |'def'   ['pen3'F'def']iles menu         'pen6'|'def||CR
  1016.     SAY pen6' |'def'   ['pen3'M'def']essages menu      'pen6'|'def||CR
  1017.     SAY pen6' |________________________|'def||CR
  1018.   END
  1019. ELSE IF menu='ALL' THEN
  1020.   DO
  1021.     SAY pen6'     __________________________________________________________'def||CR
  1022.     SAY pen6'  __/   'pen3'Main Menu            File Menu          Message Menu 'pen6'  \__'def||CR
  1023.     SAY pen6' |                                                                |'def||CR
  1024.     SAY pen6' |'def' ['pen3'H'def']elp               ['pen3'A'def']lphabetical list  ['pen3'P'def']ost messages      'pen6'|'def||CR
  1025.     SAY pen6' |'def' ['pen3'I'def']nformation        ['pen3'B'def']rowse filenotes   ['pen3'R'def']ead messages      'pen6'|'def||CR
  1026.     SAY pen6' |'def' ['pen3'Z'def'] bbs statiZtics   ['pen3'L'def']ist by Library    ['pen3'E'def']mail (private)    'pen6'|'def||CR
  1027.     SAY pen6' |'def' ['pen3'Y'def']our user data     ['pen3'N'def']ew files          ['pen3'C'def']omment to SYSOP   'pen6'|'def||CR
  1028.     SAY pen6' |'def' ['pen3'O'def']ther users info   ['pen3'F'def']ilelist archiver  ['pen3'!'def'] YELL for SYSOP   'pen6'|'def||CR
  1029.     SAY pen6' |'def' ['pen3'J'def']ump to doorways   ['pen3'+'def'] Extra Devices    ['pen3'X'def']pert (no menus)   'pen6'|'def||CR
  1030.     SAY pen6' |'def' ['pen3'S'def']earch menu        ['pen3'D'def']ownload           ['pen3'$'def'] toggle menu(s)   'pen6'|'def||CR
  1031.     SAY pen6' |'def' ['pen3'&'def'] user profiles    ['pen3'U'def']pload             ['pen3'#'def'] toggle colors    'pen6'|'def||CR
  1032.     SAY pen6' |'def' ['pen3'V'def']iew user log      ['pen3'T'def']ransfer protocol  ['pen3','def'] hourly stats     'pen6'|'def||CR
  1033.     SAY pen6' |'def' ['pen3'G'def']oodbye (logoff)   ['pen3'QUICK'def'] options      ['pen3'FL'def'] Friends List    'pen6'|'def||CR
  1034. IF(level>sysoplevel) THEN DO
  1035.     SAY pen6' |'def' ['pen3'K'def']ill a user        ['pen3'%'def'] edit filenote    ['pen3'='def'] level report     'pen6'|'def||CR
  1036.     SAY pen6' |'def' ['pen3'^'def'] view BBS logs    ['pen3'('def'] file report      ['pen3';'def'] change username  'pen6'|'def||CR;END
  1037. IF(level=99) THEN
  1038.     SAY pen6' |'def' ['pen3'~'def'] online editor    ['pen3'@'def'] dos shell        ['pen3')'def'] email report     'pen6'|'def||CR
  1039.     SAY pen6' |________________________________________________________________|'def||CR
  1040.   END
  1041. QUEUE CR  /* clears any un-CRed input in the queue */
  1042. RETURN
  1043.  
  1044.  
  1045. help:
  1046. ARG helppath .
  1047. SAY CR
  1048. SAY 'For more detailed help, use ['pen3'I'def']nformation commmand to read BBBBS.COMMANDS.'CR
  1049. IF helppath='MAIN' THEN
  1050.   SAY 'Commands available from the' pen3||menu||def 'menu:'CR
  1051. frontend=bbspath'BBS_HELP/'helppath
  1052. backend='.USER'
  1053. IF level=0 THEN backend='.NEW'
  1054. ELSE IF level=99 THEN backend='.SUPER'
  1055. ELSE IF level>sysoplevel THEN backend='.SYSOP'
  1056. CALL showtext(frontend||backend)
  1057. RETURN
  1058.  
  1059.  
  1060. waiting:
  1061. CALL checktime()
  1062. IF waitchar='Q' THEN
  1063.   DO
  1064.     waitchar=''
  1065.     RETURN
  1066.   END
  1067. waitchar=''
  1068. IF nonstop=1 THEN RETURN
  1069. OPTIONS PROMPT pen3'                          RETURN=Continue 'def
  1070. PULL waitchar
  1071. CALL cleanline(1)
  1072. CALL checkdcd()
  1073. RETURN
  1074.  
  1075.  
  1076. waiting2:
  1077. CALL checktime()
  1078. IF nonstop=1 THEN RETURN 0
  1079. waitchar=getinput(1 1 pen3'   Q=Quit   N=Non-Stop   RETURN=Continue  'def)
  1080. IF waitchar='N' THEN
  1081.   DO
  1082.     nonstop=1
  1083.     SAY lineup||pen3'To EXIT non-stop scrolling of text, press CTRL-E        'def||CR
  1084.     SAY CR
  1085.     CALL DELAY(100)
  1086.     waitchar=''
  1087.   END
  1088. CALL cleanline(1)
  1089. CALL checkdcd()
  1090. IF waitchar='Q' THEN RETURN 1
  1091. RETURN 0
  1092.  
  1093.  
  1094. busywait:
  1095. ARG bii bi bt 
  1096. IF bbsprefs.21=0 THEN RETURN
  1097. IF bi<1 THEN
  1098.   DO
  1099.     CALL WRITECH(STDOUT,'080808'x)
  1100.     RETURN
  1101.   END
  1102. IF bi=1 THEN CALL WRITECH(STDOUT,'   ')
  1103. IF bi//(bii%2)~=0 THEN RETURN
  1104. b=bi//bii
  1105. IF b=0 | b=bii%2 THEN
  1106.   DO
  1107.     tp=RIGHT((bi*100)%bt,2)'%'
  1108.     CALL WRITECH(STDOUT,'080808'x||tp)
  1109.   END
  1110. RETURN
  1111.  
  1112.  
  1113. cleanline:
  1114. ARG lflag .
  1115. IF colorflag~=1 & lflag=1 THEN RETURN
  1116. cline=lineup||LEFT(' ',78)
  1117. IF lflag=1 THEN cline=cline||lineup
  1118. SAY cline||CR
  1119. RETURN
  1120.  
  1121.  
  1122. getinput:
  1123. PARSE ARG upflag' 'oneflag' 'pline
  1124. CALL checkdcd()
  1125. OPTIONS PROMPT pline
  1126. PARSE PULL inarg
  1127. inarg=STRIP(inarg)
  1128. IF upflag THEN inarg=UPPER(inarg)
  1129. IF oneflag THEN inarg=LEFT(inarg,1)
  1130. inarg=cleanstring(0':'inarg)
  1131. RETURN inarg
  1132.  
  1133.  
  1134. docity:
  1135. PARSE ARG citi
  1136. citi=TRANSLATE(citi,'          ','+-.,*/()<>')
  1137. DO i=WORDS(citi) TO 1 BY -1
  1138.   IF DATATYPE(WORD(citi,i),'N') THEN citi=STRIP(DELWORD(citi,i,1))
  1139.   IF UPPER(WORD(citi,i))='USA' THEN citi=STRIP(DELWORD(citi,i,1))
  1140. END
  1141. citi=SPACE(citi,1)
  1142. RETURN STRIP(citi)
  1143.  
  1144.  
  1145. postuser:
  1146. IF bbsprefs.12~=1 THEN RETURN
  1147. ARG upflag .
  1148. IF upflag=6 THEN ptext='Logoff:' DATE() TIME('C')'  'name city
  1149. ELSE IF upflag=7 THEN ptext=name'  is a NEW USER!'
  1150. ELSE ptext='LogOn:' logontime'  'name city'  Last On:' DATE(,lastondate,'I')
  1151. ptext=CENTER(ptext,74)'\'
  1152. age='?'
  1153. IF UPPER(WORD(data.12,3))='BIRTHDAY:' THEN
  1154.   DO
  1155.     IF DATATYPE(WORD(data.12,4),'W') THEN
  1156.       DO
  1157.         age=LEFT(DATE('S'),4)-LEFT(WORD(data.12,4),4)
  1158.         IF SUBSTR(DATE('S'),5,2)<SUBSTR(WORD(data.12,4),5,2) THEN age=age-1
  1159.       END
  1160.   END
  1161. IF age='?' & WORD(data.12,4)~='' THEN age=WORD(data.12,4)
  1162. ptext=ptext||CENTER('Baud:' bps'   Age:' age'   Usage:' data.19,74)'\'
  1163. ptext2=''
  1164. ptext1=data.1'   '
  1165. IF DATATYPE(WORD(data.12,1),'W') THEN
  1166.   ptext2=ptext2'   First On:' DATE(,WORD(data.12,1),'S')
  1167. n=74-LENGTH(ptext1)-LENGTH(ptext2)
  1168. ptext2=ptext1||STRIP(LEFT(data.9,n))||ptext2
  1169. ptext=ptext||CENTER(ptext2,74)'\'
  1170. ulb=WORD(data.14,3)
  1171. IF ~DATATYPE(ulb,'W') | ulb=0 THEN ulb=1
  1172. dlb=WORD(data.15,3)
  1173. IF ~DATATYPE(dlb,'W') THEN dlb=0
  1174. dlup=TRUNC(dlb/ulb+.005,2)
  1175. line3='Level: 'level'   dl/ul:' dlup
  1176. IF upflag=0 THEN ptext=ptext||CENTER(line3,74)
  1177. IF upflag=1 THEN ptext=ptext||CENTER(line3'   Cmd:' opt arg,74)
  1178. IF upflag=2 THEN ptext=ptext||CENTER(line3'   MSG:' msg.msgdir,74)
  1179. IF upflag=3 THEN ptext=ptext||CENTER(line3'   Email',74)
  1180. IF upflag=4 THEN ptext=ptext||CENTER(line3'   ul:' arg 'in' plaindir,74)
  1181. IF upflag=5 THEN ptext=ptext||CENTER(line3'   dl:' arg 'in' plaindir,74)
  1182. IF upflag=6 THEN ptext=ptext||CENTER(line3'   Elapsed:'elapsed' ',74)
  1183. IF GETCLIP('BBS_fkeyhelp')=1 THEN CALL PostMsg(3,11,ptext)
  1184. ELSE CALL PostMsg(lpost,rpost,ptext)
  1185. ptext2=''
  1186. IF EXISTS(bbspath'Email/'sysop'/NEW_FILES') THEN ptext2='NEW_FILES !'
  1187. IF EXISTS(bbspath'Lists/CBV_USERS') THEN ptext2=ptext2 'CBV_USERS !'
  1188. IF EXISTS(bbspath'Lists/NEW_USERS') THEN ptext2=ptext2 'NEW_USERS !'
  1189. IF chatrequest=1 THEN ptext2=ptext2 'CHAT REQUEST !'
  1190. ptext2=STRIP(ptext2)
  1191. IF ptext2='' THEN CALL PostMsg(,,'\\\\ ')
  1192. ELSE CALL PostMsg(,,'\\\\ 'CENTER('!' ptext2,74))
  1193. RETURN
  1194.  
  1195.  
  1196. whodat:
  1197. MSG RIGHT(' ',66-LENGTH(name)) '1B'x'M'||''||''||' 'name' level 'level' '||''
  1198. RETURN
  1199.  
  1200.  
  1201. showtime:
  1202. mins=TIME('E')%60
  1203. secs=TRUNC(TIME('E')//60)+1
  1204. IF secs>59 THEN secs=59
  1205. IF secs<10 THEN secs='0'secs
  1206. line=' Time:  Used' mins':'secs
  1207. mins=(maxtime-TIME('E'))%60
  1208. secs=TRUNC((maxtime-TIME('E'))//60)
  1209. IF secs<10 THEN secs='0'secs
  1210. line=line'   Remaining' mins':'secs
  1211. SAY line||CR
  1212.  
  1213. checktime:
  1214. IF TIME('E')>maxtime THEN
  1215.   DO
  1216.     SAY 'Sorry,' name 'your time has expired.'CR
  1217.     CALL send2log('*** Time Expired ***')
  1218.     SIGNAL LOGOUT2
  1219.   END
  1220. IF TIME('E')>(maxtime-120) THEN SAY '*** Less than 2 minutes left! ***'CR
  1221. CALL whodat()
  1222. CALL checkdcd()
  1223. RETURN
  1224.  
  1225.  
  1226. setdir:
  1227. PARSE ARG tempdir
  1228. CALL PRAGMA('D',STRIP(tempdir))
  1229. directory=PRAGMA('D')
  1230. Data directory
  1231. slash=LASTPOS('/',directory)
  1232. IF slash=0 THEN slash=LASTPOS(':',directory)
  1233. plaindir=directory
  1234. IF slash>0 THEN plaindir=SUBSTR(plaindir,slash+1)
  1235. RETURN
  1236.  
  1237.  
  1238. config:
  1239. arg='s:CONFIG.BBS'
  1240. IF ~EXISTS(arg) THEN arg='BBS:BBS_TEXT/CONFIG.BBS'
  1241. IF readlines(arg 1) THEN
  1242.   DO
  1243.     SAY 's:CONFIG.BBS and BBS:BBS_TEXT/CONFIG.BBS are both missing!'CR
  1244.     SIGNAL DONE2
  1245.   END
  1246. compos=POS('/*',lynes.1)
  1247. IF compos>0 THEN lynes.1=LEFT(lynes.1,compos-1)
  1248. bbsname=STRIP(lynes.1)
  1249. sysop=WORD(lynes.2,1)
  1250. compos=POS('/*',lynes.3)
  1251. IF compos>0 THEN lynes.3=LEFT(lynes.3,compos-1)
  1252. exclusion=STRIP(lynes.3)
  1253. bbsdevice=WORD(lynes.4,1)
  1254. sysoplevel=WORD(lynes.5,1)
  1255. bbspath=WORD(lynes.6,1)
  1256. IF ~EXISTS(bbspath) THEN
  1257.   DO
  1258.     SAY bbspath 'does not exist!'CR
  1259.     SIGNAL DONE2
  1260.   END
  1261. testchar=RIGHT(bbspath,1)
  1262. IF testchar~='/' & testchar~=':' THEN bbspath=bbspath'/'
  1263. CALL SETCLIP('BBS_path',bbspath)
  1264. msgpath=WORD(lynes.7,1)
  1265. IF ~EXISTS(msgpath) THEN
  1266.   DO
  1267.     SAY msgpath 'does not exist!'CR
  1268.     SIGNAL DONE2
  1269.   END
  1270. testchar=RIGHT(msgpath,1)
  1271. IF testchar~='/' & testchar~=':' THEN msgpath=msgpath'/'
  1272. CALL SETCLIP('BBS_msgpath',msgpath)
  1273. msgpath=msgpath'MSG'
  1274. libpath=WORD(lynes.8,1)
  1275. IF ~EXISTS(libpath) THEN
  1276.   DO
  1277.     SAY libpath 'does not exist!'CR
  1278.     SIGNAL DONE2
  1279.   END
  1280. testchar=RIGHT(libpath,1)
  1281. IF testchar~='/' & testchar~=':' THEN libpath=libpath'/'
  1282. CALL SETCLIP('BBS_libpath',libpath)
  1283. extdevs=''
  1284. DO i=1 TO WORDS(lynes.10)
  1285.   test=WORD(lynes.10,i)
  1286.   IF POS(':',test)=0 THEN ITERATE i
  1287.   IF LEFT(test,2)='/*' THEN LEAVE i
  1288.   extdevs=STRIP(extdevs test)
  1289. END
  1290. SYSTEM_MSG_LIMIT=WORD(lynes.11,1)
  1291. SYSTEM_SPACE_LIMIT=WORD(lynes.12,1)
  1292. maxidle=WORD(lynes.13,1)
  1293. maxtime=WORD(lynes.14,1)
  1294. maxbps=WORD(lynes.15,1)
  1295. IF ~DATATYPE(maxbps,'W') THEN maxbps=2400
  1296. CALL SETCLIP('BBS_baud',maxbps)
  1297. DO i=16 TO 40
  1298.   j=i-15
  1299.   bbsprefs.j=STRIP(WORD(lynes.i,1))
  1300. END
  1301. spellpath=WORD(lynes.9,1)
  1302. IF bbsprefs.5 & ~EXISTS(spellpath) THEN
  1303.   DO
  1304.     SAY spellpath 'does not exist!'CR
  1305.     bbsprefs.5=0
  1306.   END
  1307. IF bbsprefs.10 THEN scratch=bbspath'Scratch'
  1308. ELSE scratch='RAM:Scratch'
  1309. CALL MAKEDIR(scratch)
  1310. IF ~DATATYPE(bbsprefs.16,'W') THEN bbsprefs.16=3
  1311. extension=WORD(lynes.32,1)
  1312. arccom=lynes.33
  1313. compos=POS('/*',lynes.33)
  1314. IF compos>0 THEN lynes.33=LEFT(lynes.33,compos-1)
  1315. arccom=STRIP(lynes.33)
  1316. IF LEFT(extension,1)~='.' THEN
  1317.   DO
  1318.     extension='.lzh'
  1319.     arccom='lharc -m m'
  1320.   END
  1321. lpost=WORD(lynes.34,1)
  1322. IF ~DATATYPE(lpost,'W') THEN lpost=3
  1323. rpost=WORD(lynes.35,1)
  1324. IF ~DATATYPE(rpost,'W') THEN rpost=14
  1325. compos=POS('/*',lynes.42)
  1326. IF compos>0 THEN lynes.42=LEFT(lynes.42,compos-1)
  1327. bbsprefs.27=STRIP(lynes.42)
  1328. RETURN
  1329.  
  1330.  
  1331. readlogs:
  1332. IF arg='' THEN
  1333.   arg=getinput(1 0 '['pen3'RETURN'def']=TODAY, or enter Log Date ('pen3||DATE('S')||def') > ')
  1334. IF arg='' THEN arg=DATE('S')
  1335. arg=bbspath'Logs/log.'arg
  1336. CALL readlines(arg 1)
  1337. CALL seelines(0)
  1338. nonstop=0
  1339. CALL waiting()
  1340. RETURN
  1341.  
  1342.  
  1343. loadcourtesy:
  1344. IF courtesyflag=0 & courtesy='' & EXISTS(bbspath'Lists/Courtesy') THEN
  1345.   DO
  1346.     IF readopen(bbspath'Lists/Courtesy') THEN
  1347.       DO
  1348.         SAY 'Checking Courtesy List...'CR
  1349.         DO i=1
  1350.           line=READLN(f)
  1351.           IF EOF(f) THEN BREAK
  1352.           line=cleanstring(1':'line)
  1353.           courtesy=courtesy line
  1354.         END
  1355.         CALL CLOSE(f)
  1356.         MSG ''
  1357.         MSG pen3'Courtesy List:'def
  1358.         MSG courtesy
  1359.       END
  1360.   END
  1361. RETURN
  1362.  
  1363.  
  1364. fileheader:
  1365. SAY 'Filename          Bytes File# Library         KeyWords'CR
  1366. SAY pen3||LEFT('=',77,'=')||def||CR
  1367. RETURN
  1368.  
  1369.  
  1370. showalpha:
  1371. IF DATATYPE(arg,'W') THEN
  1372.   DO
  1373.     dirnum=arg
  1374.     arg=''
  1375.     IF chdir2()>0 THEN RETURN
  1376.     test='Y'
  1377.   END
  1378. ELSE
  1379.   DO
  1380.     test=getinput(1 1 'Show one library only? (Ny) > ')
  1381.     IF test='Y' THEN
  1382.       DO
  1383.         IF chdir()>0 THEN RETURN
  1384.       END
  1385.   END
  1386.  
  1387. showalpha2:
  1388. IF test='Y' THEN filecount=WORDS(SHOWDIR(bbspath'FileNotes/'plaindir))
  1389. ELSE filecount=files.0
  1390. SAY '  'filecount 'files.'CR
  1391. CALL fileheader()
  1392. count=0
  1393. DO wi=1 TO alpha.0
  1394.   CALL busywait(60 wi alpha.0)
  1395.   IF test='Y' THEN
  1396.     DO
  1397.       IF count>=filecount THEN LEAVE wi
  1398.       IF UPPER(LEFT(plaindir,12))~=UPPER(LEFT(WORD(alpha.wi,5),12)) THEN
  1399.         ITERATE wi
  1400.     END
  1401.   jj=WORD(alpha.wi,4)
  1402.   IF jj>level | FIND(data.21,UPPER(dirs.jj))>0 THEN
  1403.     ITERATE wi
  1404.   CALL busywait(4 0)
  1405.   SAY alpha.wi||CR
  1406.   count=count+1
  1407.   IF (count+2)//linesperpage=0 THEN
  1408.     IF waiting2() THEN LEAVE wi
  1409.   CALL busywait(4 1)
  1410. END
  1411. CALL busywait(4 0)
  1412. nonstop=0
  1413. IF waitchar~='Q' THEN CALL waiting()
  1414. RETURN
  1415.  
  1416.  
  1417. profiles:
  1418. prodir=bbspath'Profiles'
  1419. CALL MAKEDIR(prodir)
  1420. pros=SHOWDIR(prodir)
  1421. protxt=bbspath'BBS_TEXT/PROFILES'
  1422. IF EXISTS(protxt) THEN CALL showtext(protxt)
  1423. DO lupe=1
  1424.   SAY CR
  1425.   SAY '       1. Edit 'name'''s user Profile'CR
  1426.   SAY '       2. View a User Profile'CR
  1427.   SAY '       3. Search User Profiles'CR
  1428.   SAY '       4. Browse User Profiles'CR
  1429.   SAY CR
  1430.   temp=getinput(1 1 'Enter Selection Number > ')
  1431.   IF temp=1 THEN
  1432.     DO
  1433.       lynes.=''
  1434.       IF EXISTS(prodir'/'name) THEN
  1435.         DO
  1436.           IF readlines(prodir'/'name 1)~=0 THEN ITERATE lupe
  1437.           CALL DELETE(prodir'/'name)
  1438.         END
  1439.       ELSE lynes.0=3
  1440.       lynes.1=name
  1441.       lynes.2='Profile Last Updated:' DATE('W') DATE() TIME('C')
  1442.       lynes.3=LEFT('=',74,'=')
  1443.       IF savelines(prodir'/'name)~=0 THEN
  1444.         DO
  1445.           line='Profile for' name 'failed to save!'
  1446.           SAY line||CR
  1447.           CALL send2log(line)
  1448.           ITERATE lupe
  1449.         END
  1450.       edtype=''
  1451.       CALL bbsEd(4 prodir'/'name)
  1452.       IF readlines(prodir'/'name 1)~=0 THEN CALL DELETE(prodir'/'name)
  1453.       IF lynes.0<4 THEN CALL DELETE(prodir'/'name)
  1454.       pros=SHOWDIR(prodir)
  1455.     END
  1456.   ELSE IF temp=2 THEN
  1457.     DO pf=1
  1458.       totpros=WORDS(pros)
  1459.       DO pfl=1 TO totpros BY 3
  1460.         pfl2=pfl+1
  1461.         pfl3=pfl+2
  1462.         pfline=pen3||RIGHT(pfl,3)||def LEFT(WORD(pros,pfl),21)
  1463.         IF pfl2<=totpros THEN
  1464.           pfline=pfline pen3||RIGHT(pfl2,3)||def LEFT(WORD(pros,pfl2),21)
  1465.         IF pfl3<=totpros THEN
  1466.           pfline=pfline pen3||RIGHT(pfl3,3)||def LEFT(WORD(pros,pfl3),21)
  1467.         SAY pfline||CR
  1468.         IF nonstop~=1 & ((pfl3%3)//linesperpage)=0 THEN
  1469.           IF waiting(2) THEN LEAVE pfl
  1470.       END
  1471.       emnum=getinput(1 0 pen3'Select User Profile Number > 'def)
  1472.       IF DATATYPE(emnum,'W') & emnum>0 & emnum<=totpros THEN
  1473.         DO
  1474.           tmp=WORD(pros,emnum)
  1475.           IF level>sysoplevel THEN
  1476.             DO
  1477.               CALL bbsEd(1 prodir'/'tmp)
  1478.               IF readlines(prodir'/'tmp 1)~=0 THEN CALL DELETE(prodir'/'tmp)
  1479.               IF lynes.0<4 THEN CALL DELETE(prodir'/'tmp)
  1480.               pros=SHOWDIR(prodir)
  1481.             END
  1482.           ELSE CALL showtext(prodir'/'tmp)
  1483.         END
  1484.       ELSE LEAVE pf
  1485.     END
  1486.   ELSE IF temp=3 | temp=4 THEN
  1487.     DO
  1488.       searcharg=''
  1489.       nonstop=0
  1490.       IF temp=3 THEN
  1491.         DO
  1492.           searcharg=STRIP(getinput(0 0 'Enter Search Phrase > '))
  1493.           IF searcharg='' THEN ITERATE lupe
  1494.         END
  1495.       DO ui=1 TO WORDS(pros)
  1496.         pro=prodir'/'WORD(pros,ui)
  1497.         IF temp=3 THEN
  1498.           IF textsearch(pro searcharg)=0 THEN ITERATE ui
  1499.         SAY CR
  1500.         CALL readlines(pro 1)
  1501.         IF nonstop=1 THEN rnonstop=1
  1502.         ELSE rnonstop=0
  1503.         CALL seelines(2)
  1504.         IF rnonstop THEN nonstop=1
  1505.         ELSE IF waiting2()=1 THEN LEAVE ui
  1506.         SAY CR
  1507.         SAY CR
  1508.       END
  1509.     END
  1510.   ELSE IF temp='' | LEFT(temp,1)='Q' THEN LEAVE lupe
  1511. END
  1512. DROP pros
  1513. RETURN
  1514.  
  1515.  
  1516. otheruser:
  1517. line=''
  1518. IF level>sysoplevel THEN line='['pen3'R'def']eport or'
  1519. line=line '['pen3'D'def']etails or simple ['pen3'N'def']amelist?'
  1520. IF level>sysoplevel THEN line=line '(Dnr) > '
  1521. ELSE line=line '(Dn) > '
  1522. temp=getinput(1 1 line)
  1523. IF temp='N' THEN
  1524.   DO
  1525.     CALL showuserlist()
  1526.     RETURN
  1527.   END
  1528. ELSE IF level>sysoplevel & temp='R' THEN
  1529.   DO
  1530.     SAY CR
  1531.     line=''
  1532.     IF getinput(1 1 'Report on inactive users? (nY) > ')~='N' THEN
  1533.       DO
  1534.         CALL cleanline(0)
  1535.         SAY 'INACTIVE_USERS report will be in your email.'CR
  1536.         line='USERS '
  1537.       END
  1538.     IF getinput(1 1 'Report on actual files vs. filelists? (nY) > ')~='N' THEN
  1539.       DO
  1540.         CALL cleanline(0)
  1541.         line=line'FILES'
  1542.         line=STRIP(line getinput(1 0 'Report only files larger than (0) bytes > '))
  1543.         SAY 'FILELISTS_REPORT will be in your email.'CR
  1544.       END
  1545.     SAY CR
  1546.     ADDRESS AREXX bbsREPORT.rexx name line 
  1547.     RETURN
  1548.   END
  1549. SAY CR
  1550. SAY 'To allow (or not) other users to see your street address and/or phone number,'CR
  1551. SAY 'add (or delete) STREET and/or PHONE to the line 8 list in ['pen3'Y'def']our userfile.'CR
  1552. SAY CR
  1553. SAY 'User specification may include ? wildcard for single characters.'CR
  1554. SAY 'ie,' pen3's?n'def 'will return all user names containing ''son'', ''sen'', ''sin'', etc.'CR
  1555. IF arg='' THEN arg=getinput(1 0 pen3'User specification: 'def)
  1556. IF arg='' THEN RETURN
  1557. arg=TRANSLATE(STRIP(arg),'_',' ')
  1558. CALL FileList(bbspath'Users/*'arg'*',wildlist)
  1559. line='Found' wildlist.0 'match'
  1560. IF wildlist.0~=1 THEN line=line'es'
  1561. SAY line'.'CR
  1562. IF wildlist.0<1 THEN RETURN
  1563. totlines=0
  1564. nextpagebreak=linesperpage-3
  1565. extrainfo=0
  1566. IF level>sysoplevel THEN
  1567.   DO
  1568.     IF getinput(1 1 'Display -sysop only- information? (nY) > ')~='N' THEN
  1569.       extrainfo=1
  1570.   END
  1571. DO i=1 TO wildlist.0
  1572.   CALL readlines(wildlist.i 1)
  1573.   SAY CR
  1574.   totlines=totlines+6
  1575.   SAY bak2' 'SUBSTR(wildlist.i,LASTPOS('/',wildlist.i)+1)' 'def||CR
  1576.   SAY lynes.1||CR
  1577.   IF FIND(UPPER(lynes.8),'STREET')>0 THEN
  1578.     DO
  1579.       totlines=totlines+1
  1580.       SAY lynes.2||CR
  1581.     END
  1582.   SAY lynes.3||CR
  1583.   IF FIND(UPPER(lynes.8),'PHONE')>0 THEN
  1584.     DO
  1585.       totlines=totlines+1
  1586.       SAY lynes.4||CR
  1587.     END
  1588.   SAY 'Last time on' bbsname':' DATE(,WORD(lynes.13,1),'S') WORD(lynes.13,2)||CR
  1589.   SAY pen3'Interests:'def lynes.10||CR
  1590.   IF extrainfo THEN
  1591.     DO
  1592.       SAY pen3'   up:'def lynes.14||CR
  1593.       SAY pen3' down:'def lynes.15||CR
  1594.       temptot=0
  1595.       DO j=1 TO WORDS(lynes.23)
  1596.         IF DATATYPE(WORD(lynes.23,j),'W') THEN temptot=temptot+WORD(lynes.23,j)
  1597.       END
  1598.       SAY pen3' writ:'def temptot 'public messages.'CR
  1599.       SAY pen3'level:'def lynes.20||CR
  1600.       totlines=totlines+4
  1601.       IF lynes.21~='' THEN
  1602.         DO
  1603.           totlines=totlines+1
  1604.           SAY pen3'excluded dirs:'def lynes.21||CR
  1605.         END
  1606.     END
  1607.   IF nonstop~=1 & totlines>=nextpagebreak THEN
  1608.     DO
  1609.       IF waiting2() THEN LEAVE i
  1610.       nextpagebreak=totlines+linesperpage-5
  1611.     END
  1612. END
  1613. nonstop=0
  1614. DROP wildlist.
  1615. IF waitchar~='Q' THEN CALL waiting()
  1616. RETURN
  1617.  
  1618.  
  1619. changename:
  1620. ARG cname
  1621. IF level<=sysoplevel THEN RETURN
  1622. IF cname='' THEN cname=getinput(1 0 'Current Username (include underscore): ')
  1623. IF readlines(bbspath'Users/'cname 1)>0 THEN RETURN
  1624. IF WORD(lynes,20)>=level THEN RETURN
  1625. CALL SETCLIP('BBS_oldname',cname)
  1626. CALL ChangeUserName.rexx()
  1627. ncname=GETCLIP('BBS_newname')
  1628. IF GETCLIP('BBS_oldname')='' THEN
  1629.   CALL send2log('Name change from' cname 'to' ncname)
  1630. CALL DELETE(bbspath'Lists/USERS')
  1631. sortuserflag=1
  1632. CALL SETCLIP('BBS_oldname')
  1633. CALL SETCLIP('BBS_newname')
  1634. RETURN ncname
  1635.  
  1636.  
  1637. levelreport:
  1638. minlev=0
  1639. maxlev=99
  1640. templist=''
  1641. uname=''
  1642. newufile=bbspath'Lists/NEW_USERS'
  1643. IF EXISTS(newufile) THEN
  1644.   DO
  1645.     IF getinput(1 1 'Latest New Users Only? (nY) > ')~='N' THEN
  1646.       DO
  1647.         IF readlines(newufile 1)=0 THEN
  1648.           DO i=2 TO lynes.0
  1649.             templist=STRIP(templist WORD(lynes.i,3))
  1650.           END
  1651.       END
  1652.     ELSE newufile=''
  1653.   END
  1654. ELSE newufile=''
  1655. IF newufile='' THEN
  1656.   DO
  1657.     minlev=getinput(1 0 'Minimum level? (0) > ')
  1658.     maxlev=getinput(1 0 'Maximum level? (99) > ')
  1659.     IF ~DATATYPE(minlev,'W') THEN minlev=0
  1660.     IF ~DATATYPE(maxlev,'W') THEN maxlev=99
  1661.     IF minlev<0 | minlev>99 THEN minlev=0
  1662.     IF maxlev<0 | maxlev>99 THEN maxlev=99
  1663.     templist=userlist
  1664.   END
  1665. DO levi=1 TO WORDS(templist)
  1666.   arg=bbspath'Users/'WORD(templist,levi)
  1667.   CALL readlines(arg 1)
  1668.   lt=WORD(lynes.20,1)
  1669.   IF ~DATATYPE(lt,'W') THEN lt=0
  1670.   IF lt<minlev | lt>maxlev THEN ITERATE levi
  1671.   line=lt WORD(templist,levi)
  1672.   SAY line||CR
  1673.   IF newufile~='' | lt<10 THEN
  1674.     DO
  1675.       SAY CR||LF||line||CR
  1676.       DO levj=1 TO 12
  1677.         SAY pen3'  'lynes.levj||def||CR
  1678.       END
  1679.       SAY pen3'  'lynes.19||def||CR
  1680.     END
  1681.   ELSE ITERATE levi
  1682.   lcom=''
  1683.   IF lt<10 THEN lcom='['pen3'A'def']dd  '
  1684.   lcom=lcom'['pen3'K'def']ill  ['pen3'R'def']ename  ['pen3'S'def']kip this user?'
  1685.   IF lt<10 THEN lcom=lcom' (Akrs) > '
  1686.   ELSE lcom=lcom '(krS) > '
  1687.   lcom=getinput(1 1 lcom)
  1688.   CALL cleanline(0)
  1689.   IF lcom='K' THEN
  1690.     DO
  1691.       arg=WORD(templist,levi)
  1692.       CALL killuser()
  1693.     END
  1694.   ELSE IF lcom='R' THEN
  1695.     DO
  1696.       newname=changename(WORD(templist,levi))
  1697.       IF newname~='' & newname~=WORD(templist,levi) THEN
  1698.         DO
  1699.           temp=WORDINDEX(templist,levi+1)
  1700.           rtemp=''
  1701.           IF temp>0 THEN rtemp=SUBSTR(templist,temp)
  1702.           temp=WORDINDEX(templist,levi)
  1703.           templist=''
  1704.           IF temp>2 THEN templist=STRIP(LEFT(templist,temp-1))
  1705.           templist=STRIP(templist newname rtemp)
  1706.           userlist=userlist newname
  1707.         END
  1708.       levi=levi-1
  1709.       CALL SETCLIP('BBS_newname')
  1710.     END
  1711.   ELSE IF lcom~='S' & lt<10 THEN
  1712.     DO
  1713.       IF readopen(bbspath'BBS_TEXT/DEF.MEMBER') THEN
  1714.         DO
  1715.           DO lvi=1 TO 22
  1716.             line=READLN(f)
  1717.             IF lvi=11 THEN lynes.11=line
  1718.             IF lvi=20 THEN lynes.20=line
  1719.             IF lvi=21 THEN lynes.21=line
  1720.           END
  1721.           lynes.22=line
  1722.           CALL CLOSE(f)
  1723.           edtype=''
  1724.           IF bbsprefs.25=1 THEN
  1725.             DO
  1726.               SAY CR
  1727.               lynes.22=''
  1728.               lynes.23=''
  1729.               IF DATATYPE(lynes.20,'W') THEN
  1730.                 DO
  1731.                   SAY 'Setting message counters to last 10 messages in each conference...'CR
  1732.                   DO i=1 TO lynes.20
  1733.                     num=countcheck(bbspath'Numbers/LastMessage'i 0)-10
  1734.                     IF num<0 | msg.i.0<10 THEN num=0
  1735.                     lynes.22=lynes.22 num
  1736.                     lynes.23=lynes.23 0
  1737.                   END
  1738.                 END
  1739.               ELSE CALL send2log('Bad default level in BBS_TEXT/DEF.MEMBER file!')
  1740.               SAY 'Setting file counter to last file uploaded...'CR
  1741.               lynes.16=countcheck(bbspath'Numbers/LastFile' 0)
  1742.               lynes.16=lynes.16 '19900101 00:00:00'
  1743.             END
  1744.           lynes.0=27
  1745.           CALL savelines(arg)
  1746.           SAY lynes.20 WORD(templist,levi) 'has been made a member.'CR
  1747.         END
  1748.       ELSE SAY 'You need a default member file in BBS_TEXT!  ( BBS_TEXT/DEF.MEMBER )'CR
  1749.     END
  1750.   IF lcom~='K' & lcom~='R' & newufile~='' THEN
  1751.     DO
  1752.       nlt=getinput(1 0 lynes.20 'Enter new level or blank for no change. > ')
  1753.       IF DATATYPE(nlt,'W') THEN
  1754.         DO
  1755.           lynes.20=nlt
  1756.           CALL savelines(arg)
  1757.         END
  1758.       CALL writenew()
  1759.     END
  1760. END
  1761. IF newufile~='' & EXISTS(newufile) THEN
  1762.   IF getinput(1 1 'Delete NEW_USERS file? (nY) > ')~='N' THEN CALL DELETE(newufile)
  1763. IF EXISTS(bbspath'Lists/CBV_USERS') THEN
  1764.   IF getinput(1 1 'Delete CBV_USERS file? (nY) > ')~='N' THEN
  1765.     CALL DELETE(bbspath'Lists/CBV_USERS')
  1766. DROP templist
  1767. RETURN
  1768.  
  1769.  
  1770. writenew:
  1771. arg=WORD(templist,levi)
  1772. IF getinput(1 1 'Write' arg 'an email message? (nY) > ')~='N' THEN
  1773.   DO
  1774.     IF EXISTS(bbspath'BBS_TEXT/EMAIL_WELCOME') THEN
  1775.       IF getinput(1 1 'Use default welcome? (nY) > ')~='N' THEN replysubj='|@NEW@|'
  1776.     CALL editor('MAIL' arg)
  1777.   END
  1778. RETURN
  1779.  
  1780.  
  1781. filereport:
  1782. SAY 'Searching for mismatches between files and filenotes...'CR
  1783. DO i=1 TO sysoplevel+1
  1784.   IF dirs.i='' THEN ITERATE
  1785.   SAY dirs.i'                               'lineup||CR
  1786.   rfiles=SHOWDIR(libpath||dirs.i)
  1787.   rnotes=SHOWDIR(bbspath'FileNotes/'dirs.i)
  1788.   IF WORDS(rfiles)~=WORDS(rnotes) THEN
  1789.     DO
  1790.       line='Compare files & filenotes in'pen3 dirs.i||def'. '
  1791.       DO j=1 TO WORDS(rfiles)
  1792.         IF FIND(UPPER(rnotes),UPPER(WORD(rfiles,j)))=0 THEN
  1793.           line=line WORD(rfiles,j)
  1794.       END
  1795.       SAY line||CR
  1796.     END
  1797. END
  1798. Send '^G'
  1799. CALL waiting()
  1800. RETURN
  1801.  
  1802.  
  1803. mailreport:
  1804. SAY 'Checking ALL pending Email...'CR
  1805. SAY pen3' - Use CTRL-E to Exit -'def||CR
  1806. SAY CR
  1807. mailrep=SHOWDIR(bbspath'Email','D')
  1808. mailfil=SHOWDIR(bbspath'EmailFiles','D')
  1809. lastemail=WORD(data.17,3)
  1810. IF ~DATATYPE(lastemail,'W') THEN lastemail=0
  1811. IF lastemail=countcheck(bbspath'Numbers/LastMail' 0) THEN
  1812.   DO
  1813.     DROP mailrep. mailfil.
  1814.     RETURN
  1815.   END
  1816. mailynes.=''
  1817. mk=0
  1818. DO mi=1 TO WORDS(mailrep)
  1819.   muser=WORD(mailrep,mi)
  1820.   IF muser=sysop | muser=name THEN ITERATE mi
  1821.   mlist=SHOWDIR(bbspath'Email/'muser)
  1822.   IF WORDS(mlist)>0 THEN SAY lineup||RIGHT(muser,40)||CR
  1823.   DO mj=1 TO WORDS(mlist)
  1824.     fuser=WORD(mlist,mj)
  1825.     IF POS(sysop,fuser)>0 THEN ITERATE mj
  1826.     IF logonflag=0 THEN
  1827.       DO
  1828.         mk=mk+1
  1829.         mailynes.mk=pen3||LEFT(muser,20) 'from'def LEFT(fuser,20) DATE(,WORD(STATEF(bbspath'Email/'muser'/'fuser),5),'I')
  1830.       END
  1831.     IF POS(sysop,fuser)=0 & POS(name,fuser)=0 THEN
  1832.       DO
  1833.         testnum=RIGHT(fuser,LENGTH(fuser)-LASTPOS('.',fuser))
  1834.         IF testnum>emailnum THEN emailnum=testnum
  1835.         IF testnum>lastemail THEN
  1836.           DO
  1837.             CALL showtext(bbspath'Email/'muser'/'fuser)
  1838.             SAY CR
  1839.             SAY CR
  1840.             IF waitchar='Q' THEN LEAVE mi
  1841.           END
  1842.       END
  1843.   END
  1844.   IF logonflag=0 & FIND(mailfil,muser)>0 THEN
  1845.     DO
  1846.       efilelist=SHOWDIR(bbspath'EmailFiles/'muser)
  1847.       IF WORDS(efilelist)>0 THEN
  1848.         DO
  1849.           mk=mk+1
  1850.           mailynes.mk=pen3||LEFT(muser,20) 'emailfiles'def efilelist
  1851.         END
  1852.     END
  1853. END
  1854. data.17=WORD(data.17,1) WORD(data.17,2) countcheck(bbspath'Numbers/LastMail' 0)
  1855. IF mk>0 THEN
  1856.   DO
  1857.     lynes.0=mk
  1858.     DO mi=1 TO mk
  1859.       lynes.mi=mailynes.mi
  1860.     END
  1861.     CALL seelines(1)
  1862.     nonstop=0
  1863.     CALL waiting()
  1864.   END
  1865. ELSE SAY 'No unseen Email pending.'CR
  1866. DROP mailrep. mailfil. mailynes. mlist
  1867. RETURN
  1868.  
  1869.  
  1870. sortdoors:
  1871. IF ~DATATYPE(jdoors.0,'W') THEN doors.0=0
  1872. IF WORDS(SHOWDIR(bbspath'rexxDoors','F'))~=doors.0 THEN
  1873.   DO
  1874.     jdoors.=''
  1875.     doorlist=SHOWDIR(bbspath'rexxDoors','F')
  1876.     doors.=''
  1877.     doors.0=WORDS(doorlist)
  1878.     DO i=1 TO doors.0
  1879.       doors.i=WORD(doorlist,i)
  1880.     END
  1881.     SAY 'Sorting..'lineup||CR
  1882.     CALL QSORT(1,doors.0,doors)
  1883.     jdoors.0=doors.0%3
  1884.     IF (doors.0//3)>0 THEN jdoors.0=jdoors.0+1
  1885.     DO i=1 TO jdoors.0
  1886.       DO j=0 TO 2
  1887.         k=i+j*jdoors.0
  1888.         IF k<=doors.0 THEN
  1889.           DO
  1890.             jdoors.i=jdoors.i' 'LEFT(RIGHT(k,3)'.' LEFT(doors.k,LENGTH(doors.k)-5),24)
  1891.             dcount=WORD(STATEF(bbspath'rexxDoors/'doors.k),8)
  1892.             jdoors.i.0=jdoors.i.0||LEFT(RIGHT(dcount,5) LEFT(doors.k,LENGTH(doors.k)-5),24)' '
  1893.           END
  1894.       END
  1895.     END
  1896.   END
  1897. RETURN 0
  1898.  
  1899.  
  1900. jump2rexx:
  1901. CALL sound('JUMP')
  1902. CALL sortdoors()
  1903. temp=1
  1904. readcount=-1
  1905. DO doorloop=1
  1906.   IF temp=0 THEN
  1907.     DO
  1908.       IF readcount~=-1 THEN
  1909.         DO
  1910.           doors.0=''
  1911.           CALL sortdoors()
  1912.         END
  1913.       SAY CENTER('- Number of accesses per file -',75)||CR
  1914.     END
  1915.   SAY pen3||LEFT('-',75,'-')||def||CR
  1916.   DO jd=1 TO jdoors.0
  1917.     IF temp=0 THEN SAY jdoors.jd.0||CR
  1918.     ELSE SAY jdoors.jd||CR
  1919.     IF jd//linesperpage=0 THEN CALL waiting()
  1920.     IF waitchar='Q' THEN LEAVE doorloop
  1921.   END
  1922.   IF temp=0 THEN
  1923.     DO
  1924.       CALL waiting()
  1925.       temp=1
  1926.       ITERATE doorloop
  1927.     END
  1928.   temp=getinput(1 0 pen3'Select Application Number. 0=Stats > 'def)
  1929.   IF temp=0 THEN ITERATE doorloop
  1930.   IF ~DATATYPE(temp,'W') | temp<1 | temp>doors.0 THEN LEAVE doorloop
  1931.   IF TIME('E')>(maxtime-120) THEN
  1932.     DO
  1933.       SAY CR
  1934.       SAY '*** Less than 2 minutes left! ***'CR
  1935.       SAY '***   rexxDoors are closed!   ***'CR
  1936.       SAY CR
  1937.       LEAVE doorloop
  1938.     END
  1939.   arg=doors.temp
  1940.   IF GETCLIP('BBS_localdoor')=arg THEN
  1941.     DO
  1942.       SAY 'That door is in use!  Try again in a few minutes...'CR
  1943.       ITERATE doorloop
  1944.     END
  1945.   CALL SETCLIP('BBS_door',arg)
  1946.   readcount=WORD(STATEF(bbspath'rexxDoors/'arg),8)
  1947.   IF ~DATATYPE(readcount,'W') THEN readcount=0
  1948.   ADDRESS COMMAND 'C:filenote' bbspath'rexxDoors/'arg readcount+1
  1949.   CALL postuser(1)
  1950.   curdir=PRAGMA('D')
  1951.   CALL setdir(bbspath'rexxDoors')
  1952.   CALL send2log('Door: 'doors.temp 'at' TIME('C'))
  1953.   CALL SETCLIP('BBS_winnings')
  1954.   savewinnings=0
  1955.   timeleft=TRUNC(maxtime-TIME('E'))
  1956.   IF UPPER(doors.temp)='ONE_ARMED_BANDIT.REXX' THEN
  1957.     IF getinput(1 1 'Play for this sessions time in seconds? (Ny) > ')='Y' THEN
  1958.       DO
  1959.         savewinnings=winnings
  1960.         IF savewinnings=0 THEN savewinnings=1
  1961.         winnings=timeleft
  1962.         SAY 'Playing for REAL seconds, not wimpy play-dollars!'CR
  1963.       END
  1964.   comm='CALL' doors.temp'('name winnings savewinnings colorflag timeleft-42')'
  1965.   INTERPRET comm
  1966.   testwin=GETCLIP('BBS_winnings')
  1967.   IF DATATYPE(testwin,'N') THEN
  1968.     DO
  1969.       IF savewinnings>0 THEN
  1970.         DO
  1971.           IF testwin>7200 THEN
  1972.             DO
  1973.               SAY 'Although you won' TRUNC(testwin/60) 'minutes, the maximum session time is 120 minutes.'CR
  1974.               testwin=7200
  1975.             END
  1976.           maxtime=TRUNC(testwin+TIME('E'))
  1977.           winnings=savewinnings
  1978.         END
  1979.       ELSE winnings=testwin
  1980.     END
  1981.   CALL setdir(curdir)
  1982.   CALL SETCLIP('BBS_winnings')
  1983.   CALL SETCLIP('BBS_door')
  1984.   SAY CR
  1985.   CALL showtime()
  1986. END
  1987. CALL SETCLIP('BBS_winnings')
  1988. CALL SETCLIP('BBS_door')
  1989. RETURN
  1990.  
  1991.  
  1992. sortlibraries:
  1993. SAY 'Sorting Libraries...'CR
  1994. count=0
  1995. sdirs.=''
  1996. DO i=1 TO level
  1997.   IF dirs.i='' THEN ITERATE i
  1998.   count=count+1
  1999.   sdirs.count=dirs.i i
  2000. END
  2001. sdirs.0=count
  2002. CALL QSort(1,count,sdirs)
  2003. count=0
  2004. libs.=''
  2005. DO i=1 TO sdirs.0
  2006.   tempnum=WORD(sdirs.i,2)
  2007.   tempdir=WORD(sdirs.i,1)
  2008.   IF FIND(data.21,UPPER(tempdir))=0 THEN
  2009.     DO
  2010.       string=' '
  2011.       IF tempnum<10 THEN string=string' '
  2012.       string=string || tempnum'. 'LEFT(tempdir,14)
  2013.       count=count+1
  2014.       libs.count=string
  2015.     END
  2016. END
  2017. libs.0=count%4
  2018. IF (count//4)>0 THEN libs.0=libs.0+1
  2019. DO i=1 TO libs.0
  2020.   DO j=1 TO 3
  2021.     k=i+j*libs.0
  2022.     IF k<=count THEN libs.i=libs.i||libs.k
  2023.   END
  2024. END
  2025. DROP sdirs.
  2026. CALL sortconferences()
  2027. RETURN
  2028.  
  2029.  
  2030. sortconferences:
  2031. SAY 'Sorting Conferences...'CR
  2032. count=0
  2033. smsg.=''
  2034. DO i=1 TO level
  2035.   IF msg.i='' THEN ITERATE i
  2036.   count=count+1
  2037.   smsg.count=msg.i i
  2038. END
  2039. smsg.0=count
  2040. CALL QSort(1,count,smsg)
  2041. count=0
  2042. msgs.=''
  2043. DO i=1 TO smsg.0
  2044.   tempnum=WORD(smsg.i,2)
  2045.   tempdir=WORD(smsg.i,1)
  2046.   IF FIND(data.21,tempnum)=0 THEN
  2047.     DO
  2048.       string=' '
  2049.       IF tempnum<10 THEN string=string' '
  2050.       string=string || tempnum'.'
  2051.       IF WORD(data.22,tempnum)='' | WORD(data.22,tempnum)>=0 THEN
  2052.         string=string LEFT(tempdir,20)
  2053.       ELSE string=string pen3'-OFF-'def LEFT(tempdir,14)
  2054.       count=count+1
  2055.       msgs.count=string
  2056.     END
  2057. END
  2058. msgs.0=count%3
  2059. IF (count//3)>0 THEN msgs.0=msgs.0+1
  2060. DO i=1 TO msgs.0
  2061.   DO j=1 TO 2
  2062.     k=i+j*msgs.0
  2063.     IF k<=count THEN msgs.i=msgs.i msgs.k
  2064.   END
  2065. END
  2066. DROP smsg.
  2067. RETURN
  2068.  
  2069.  
  2070. readmessages:
  2071. searcharg=''
  2072. DO FOREVER
  2073.   SAY CR
  2074.   PARSE VAR arg temp' 'arg .
  2075.   IF DATATYPE(temp,'W') THEN msgdir=temp
  2076.   ELSE IF LEFT(UPPER(temp),1)='A' THEN
  2077.     DO
  2078.       CALL newmsgs()
  2079.       arg=''
  2080.       RETURN
  2081.     END
  2082.   ELSE IF LEFT(UPPER(temp),1)='M' THEN
  2083.     DO
  2084.       CALL readmarked()
  2085.       arg=''
  2086.       RETURN
  2087.     END
  2088.   ELSE
  2089.     DO
  2090.       SAY 'Select Message Conference By Number, ['pen3'M'def']arked only or ['pen3'A'def']ll Active'CR
  2091.       IF areaselect() THEN
  2092.         DO
  2093.           IF LEFT(temp,1)='A' THEN CALL newmsgs()
  2094.           IF LEFT(temp,1)='M' THEN CALL readmarked()
  2095.           RETURN
  2096.         END
  2097.     END
  2098.   pline='['pen3'A'def']rchive ['pen3'S'def']earch ['pen3'T'def']oggle ON/OFF'
  2099.   pline=pline '['pen3'R'def']ead ['pen3'Q'def']uit (aqRst) > '
  2100.   IF arg~='' THEN junk=UPPER(LEFT(arg,1))
  2101.   ELSE junk=getinput(1 1 pline)
  2102.   IF junk='Q' THEN RETURN
  2103.   IF junk='A' THEN
  2104.     DO
  2105.       SAY CR
  2106.       CALL msgcount(msgdir)
  2107.       junk=getinput(1 0 pen3'RETURN'def' to archive new msgs, ['pen3'Q'def']uit, or enter starting message number > ')
  2108.       IF junk='Q' THEN RETURN
  2109.       IF DATATYPE(junk,'W') THEN
  2110.         DO
  2111.           IF junk>lastmess | junk<1 THEN junk=1
  2112.           lastread.msgdir=junk-1
  2113.           CALL savedata(1)
  2114.         END
  2115.       CALL SETCLIP('BBS_MSGS','ON')
  2116.       SAY 'Archiving messages in the'pen3 msg.msgdir def'Conference...'CR
  2117.       lastread.msgdir=countcheck(bbspath'Numbers/LastMessage'msgdir 0)
  2118.       CALL send2log('Arc: ArcMsgs.rexx' msg.msgdir)
  2119.       ADDRESS AREXX ArcMsgs.rexx name msgdir
  2120.       IF emailonline>=0 THEN emailonline=emailonline+1
  2121.       DO WHILE GETCLIP('BBS_MSGS')~=''
  2122.         CALL DELAY(14)
  2123.       END
  2124.       SAY 'When completed, the archive will be attached to email addressed to you.'CR
  2125.       CALL savedata(1)
  2126.       SAY CR
  2127.       RETURN
  2128.     END
  2129.   IF junk='S' THEN
  2130.     DO
  2131.       searcharg=''
  2132.       searcharg=getinput(0 0 pen3'Search Phrase: 'def)
  2133.       IF LENGTH(STRIP(searcharg))=0 THEN RETURN
  2134.       searcharg=COMPRESS(searcharg,'*')
  2135.       SAY CR
  2136.       CALL searchmsgdir()
  2137.       SAY CR
  2138.       SAY 'All messages in the'pen3 msg.msgdir def'Conference have been searched.'CR
  2139.       SAY CR
  2140.       CALL waiting()
  2141.       searcharg=''
  2142.       RETURN
  2143.     END
  2144.   IF junk='T' THEN
  2145.     DO
  2146.       line='Turning the' msg.msgdir 'conference'
  2147.       IF WORD(data.22,msgdir)<0 THEN
  2148.         DO
  2149.           line=line pen3'ON'def'.'
  2150.           newdata='0'
  2151.         END
  2152.       ELSE
  2153.         DO
  2154.           line=line pen3'OFF'def'.'
  2155.           newdata='-1'
  2156.         END
  2157.       SAY line||CR
  2158.       dataloc=WORDINDEX(data.22,msgdir)-1
  2159.       data.22=DELWORD(data.22,msgdir,1)
  2160.       IF dataloc>0 THEN data.22=INSERT(newdata' ',data.22,dataloc)
  2161.       CALL sortconferences()
  2162.     END
  2163.   CALL readmsg(0)
  2164.   CALL saveData(1)
  2165.   nonstop=0
  2166.   arg=''
  2167. END
  2168. RETURN
  2169.  
  2170.  
  2171. newmsgs:
  2172. test=UPPER(LEFT(arg,1))
  2173. IF test='' THEN
  2174.   test=getinput(1 1 '['pen3'R'def']ead new messages or ['pen3'A'def']rchive for later download. (aR) > ')
  2175. IF test='A' THEN
  2176.   DO
  2177.     CALL SETCLIP('BBS_MSGS','ON')
  2178.     SAY CR
  2179.     SAY 'Archiving new conference messages...'CR
  2180.     CALL send2log('Arc: ArcMsgs.rexx')
  2181.     ADDRESS AREXX ArcMsgs.rexx name
  2182.     IF emailonline>=0 THEN emailonline=emailonline+1
  2183.     clear_marked=1
  2184.     DO i=1 TO level
  2185.       IF WORD(data.22,i)~=-1 THEN
  2186.         lastread.i=countcheck(bbspath'Numbers/LastMessage'i 0)
  2187.     END
  2188.     DO WHILE GETCLIP('BBS_MSGS')~=''
  2189.       CALL DELAY(14)
  2190.     END
  2191.     SAY 'When completed, the archive will be attached to email addressed to you.'CR
  2192.     CALL savedata(1)
  2193.     SAY CR
  2194.     RETURN
  2195.   END
  2196. curmsgdir=msgdir
  2197. SAY 'Scanning all Conferences for new messages..'CR
  2198. DO newi=1 TO level
  2199.   IF msg.newi='' THEN ITERATE newi
  2200.   msgdir=newi
  2201.   CALL readmsg(1)
  2202.   IF msgcom='Q' THEN LEAVE newi
  2203. END
  2204. CALL saveData(1)
  2205. msgdir=curmsgdir
  2206. nonstop=0
  2207. RETURN
  2208.  
  2209.  
  2210. readmsg:
  2211. ARG quietflag marknum .
  2212. msgcom=''
  2213. IF msg.msgdir='' | FIND(data.21,msgdir)>0 THEN RETURN; /* sysop excluded */
  2214. IF WORD(data.22,msgdir)=-1 THEN RETURN;                /*  user excluded */
  2215. entering='Entering'pen3 msg.msgdir def'Message Conference..'
  2216. IF quietflag=0 & marknum='' THEN SAY entering||CR
  2217. CALL postuser(2)
  2218. IF DATATYPE(WORD(data.22,msgdir),'W') THEN
  2219.   lastread.msgdir=WORD(data.22,msgdir)
  2220. ELSE lastread.msgdir=0
  2221. lstwrt=countcheck(bbspath'Numbers/LastMessage'msgdir 0)
  2222. frstwrt=countcheck(bbspath'Numbers/FirstMessage'msgdir 0)
  2223. temp=''
  2224. IF marknum='' THEN
  2225.   DO
  2226.     IF lastread.msgdir>=lstwrt | lastread.msgdir<frstwrt THEN
  2227.       DO
  2228.         lastread.msgdir=lstwrt
  2229.         CALL msgcount(msgdir)
  2230.         IF quietflag=1 & lastread.msgdir=lstwrt THEN RETURN
  2231.         IF nonstop=1 THEN temp=''
  2232.         ELSE temp=getinput(1 0 pen3'Enter starting message number > 'def)
  2233.         IF temp='' THEN temp=lastread.msgdir
  2234.         IF ~DATATYPE(temp,'W') THEN RETURN
  2235.         IF temp<frstwrt THEN temp=frstwrt
  2236.         IF temp>lstwrt THEN temp=lstwrt
  2237.         IF temp<1 THEN temp=1
  2238.         lastread.msgdir=temp-1
  2239.       END
  2240.   END
  2241. ELSE lastread.msgdir=marknum-1
  2242. IF quietflag=1 THEN SAY entering||CR
  2243. dirname=msgpath||msgdir
  2244. msglist.=0 /* set read to 0, unread to 1, and reply >=2 */
  2245. firstmess=999999
  2246. testlist=SHOWDIR(dirname)
  2247. DO i=1 TO WORDS(testlist)
  2248.   test=WORD(testlist,i)
  2249.   IF test>lastread.msgdir THEN msglist.test=1
  2250.   IF test<firstmess THEN firstmess=test
  2251. END
  2252. IF firstmess=999999 THEN firstmess=0
  2253. CALL countcheck(bbspath'Numbers/FirstMessage'msgdir firstmess)
  2254. msgstatus=1
  2255. IF temp='' & marknum='' THEN CALL msgcount(msgdir)
  2256. skipsubj.=''
  2257. skipsubj.0=0
  2258. DO msgloop=1
  2259.   lastreadnum=lastread.msgdir
  2260.   DO WHILE msglist.lastreadnum=0 & lastreadnum<lstwrt
  2261.     lastreadnum=lastreadnum+1
  2262.   END
  2263.   lastread.msgdir=lastreadnum
  2264.   IF lastreadnum=lstwrt & msglist.lstwrt=0 THEN LEAVE msgloop
  2265.   DO mess=lastread.msgdir TO lstwrt+1
  2266.     IF marknum~='' THEN
  2267.       DO
  2268.         IF mess>marknum THEN LEAVE msgloop
  2269.         mess=marknum
  2270.       END
  2271.     IF msglist.mess~=msgstatus THEN ITERATE mess
  2272.     IF msgstatus>1 THEN SAY 'Following the thread, level' msgstatus-1'.'CR
  2273.     msglist.mess=0
  2274.     arg=dirname'/'mess
  2275.     IF ~EXISTS(arg) THEN
  2276.       DO
  2277.         SAY 'Message number' mess 'is missing.'CR
  2278.         ITERATE mess
  2279.       END
  2280.     IF ~readopen(arg) THEN ITERATE mess
  2281.     firstline=READLN(f)
  2282.     secondline=READLN(f)
  2283.     thirdline=READLN(f)
  2284.     forthline=READLN(f)
  2285.     CALL CLOSE(f)
  2286.     CALL killmark(msgdir mess)
  2287.     DO skp=1 TO skipsubj.0
  2288.       IF forthline=skipsubj.skp THEN ITERATE mess
  2289.     END
  2290.     IF WORDS(firstline)>2 THEN /* if replies, change their num to >1 */
  2291.       DO
  2292.         thread=SUBSTR(firstline,WORDINDEX(firstline,4))
  2293.         DO tindx=1 TO WORDS(thread)
  2294.           test=WORD(thread,tindx)
  2295.           IF msglist.test~=0 THEN msglist.test=msgstatus+1
  2296.         END
  2297.       END
  2298.     savearg=arg
  2299.     msgcom='A'
  2300.     DO msgloop2=1 WHILE msgcom='A' | msgcom='O'
  2301.       CALL readlines(arg 1)
  2302.       IF nonstop=1 THEN rnonstop=1
  2303.       ELSE rnonstop=0
  2304.       CALL seelines(2)
  2305.       msgcom=''
  2306.       IF rnonstop THEN
  2307.         DO
  2308.           SAY CR
  2309.           nonstop=1
  2310.           msgcom=''
  2311.         END
  2312.       ELSE
  2313.         DO
  2314.           pline=''
  2315.           IF level<=sysoplevel | WORDS(lynes.3)<3 THEN pline='['pen3'A'def']gain'
  2316.           IF level>sysoplevel | name=WORD(lynes.2,2) THEN
  2317.             pline=pline '['pen3'E'def']dit ['pen3'K'def']ill'
  2318.           IF level>sysoplevel THEN pline=pline '['pen3'M'def']ove'
  2319.           IF WORDS(lynes.3)>3 THEN pline=pline '['pen3'O'def']riginal'
  2320.           pline=pline '['pen3'N'def']onStop ['pen3'R'def']eply'
  2321.           IF level=99 THEN pline=pline '['pen3'!'def']'
  2322.           pline=pline '['pen3'S'def']kip ['pen3'Q'def']uit ['pen3'?'def']'
  2323.           msgcom=getinput(1 0 STRIP(pline)' > ')
  2324.           CALL cleanline(0)
  2325.         END
  2326.       CALL checktime()
  2327.       IF DATATYPE(msgcom,'W') & EXISTS(dirname'/'msgcom) THEN
  2328.         DO
  2329.           arg=dirname'/'msgcom
  2330.           IF msgcom>lastread.msgdir THEN lastread.msgdir=msgcom
  2331.           msgcom='A'
  2332.           ITERATE msgloop2
  2333.         END
  2334.       ELSE msgcom=LEFT(msgcom,1)
  2335.       IF msgcom='Q' THEN LEAVE msgloop
  2336.       ELSE IF msgcom='!' & level>sysoplevel THEN
  2337.         DO
  2338.           CALL DELETE(arg)
  2339.           newchar=LEFT(lynes.1,1)
  2340.           IF newchar~='!' THEN newchar='!!'
  2341.           ELSE newchar='  '
  2342.           lynes.1=OVERLAY(newchar,lynes.1,1,2)
  2343.           CALL savelines(arg)
  2344.           ITERATE msgloop2
  2345.         END
  2346.       ELSE IF msgcom='A' THEN ITERATE msgloop2
  2347.       ELSE IF msgcom='M' & level>sysoplevel THEN
  2348.         DO
  2349.           prevmsgdir=msgdir
  2350.           If ~areaselect() THEN
  2351.             DO
  2352.               himsg=countcheck(bbspath'Numbers/LastMessage'msgdir 0)+1
  2353.               lynes.1='  Msg:' himsg
  2354.               lynes.3='   To:' WORD(lynes.3,2)
  2355.               lynes.5=STRIP(DELWORD(lynes.5,8,1)) msg.msgdir
  2356.               nlyn=lynes.0+1
  2357.               lynes.0=nlyn
  2358.               lynes.nlyn=' *** Moved from the' msg.prevmsgdir 'conference ***'
  2359.               CALL savelines(msgpath||msgdir'/'himsg)
  2360.               CALL countcheck(bbspath'Numbers/LastMessage'msgdir himsg)
  2361.               CALL msgmark(WORD(lynes.3,2) msgdir himsg)
  2362.               CALL readlines(arg 1)
  2363.               CALL DELETE(arg)
  2364.               CALL DELAY(28)
  2365.               lynes.0=7
  2366.               lynes.7='*** Moved to the' msg.msgdir 'conference, message #'himsg' ***'
  2367.               CALL savelines(arg)
  2368.             END
  2369.           msgdir=prevmsgdir
  2370.           msgcom='A'
  2371.         END
  2372.       ELSE IF msgcom='N' THEN
  2373.         DO
  2374.           nonstop=1
  2375.           msgcom=''
  2376.         END
  2377.       ELSE IF msgcom='H' | msgcom='?' THEN
  2378.         DO
  2379.           SAY pen3' - HELP with the Read Messages commands -'def||CR
  2380.           SAY ' RETURN reads the next message in line.'CR
  2381.           SAY ' 34 will read message number 34, if it exists in this conference.'CR
  2382.           SAY ' A  reads this message Again (in case it scrolled off screen).'CR
  2383.           IF level>sysoplevel | name=WORD(lynes.2,2) THEN
  2384.             DO
  2385.           SAY ' E  puts this message into the online Editor.'CR
  2386.           SAY ' K  deletes a message you wrote. you cannot Kill others!'CR
  2387.             END
  2388.           IF level>sysoplevel THEN
  2389.           SAY ' M  move this message to a new conference.'CR
  2390.           SAY ' N  displays all new messages without pausing. CTRL-E to Exit!'CR
  2391.           SAY ' O  if this message is a reply, will read the Original message.'CR
  2392.           SAY ' R  enters the message editor to Reply to this message.'CR
  2393.           SAY ' S  allows you to Skip threads or conferences.'CR
  2394.         IF level=99 THEN
  2395.           SAY ' !  toggles the do-not-purge! flag for this message.'CR
  2396.           SAY ' Q  returns to the message menu. (Quit)'CR
  2397.           SAY CR
  2398.           CALL waiting()
  2399.           msgcom='A'
  2400.           IF waitchar='Q' THEN LEAVE msgloop
  2401.         END
  2402.       ELSE IF msgcom='E' THEN
  2403.         DO
  2404.           IF level>sysoplevel | name=WORD(lynes.2,2) THEN
  2405.             DO
  2406.               sline=7
  2407.               IF level>sysoplevel THEN sline=1
  2408.               CALL bbsED(sline arg)
  2409.               msgcom='A'
  2410.             END
  2411.         END
  2412.       ELSE IF msgcom='S' & mess<lstwrt THEN
  2413.         DO
  2414.           stemp=''
  2415.           DO WHILE stemp~='T' & stemp~='C'
  2416.             stemp=getinput(1 1 'Skip this ['pen3'T'def']hread or the entire ['pen3'C'def']onference (ct) > ')
  2417.           END
  2418.           IF stemp='T' THEN
  2419.             DO
  2420.               SAY CR
  2421.               SAY pen3 forthline||def||CR
  2422.               SAY 'Skipping messages with this subject heading...'CR
  2423.               SAY CR
  2424.               DO i=lastread.msgdir TO lstwrt
  2425.                 IF msglist.i>1 THEN msglist.i=0
  2426.               END
  2427.               skipsubj.0=skipsubj.0+1
  2428.               sksb=skipsubj.0
  2429.               skipsubj.sksb=forthline
  2430.             END
  2431.           ELSE
  2432.             DO
  2433.               SAY pen3'Skipping to the last message in the'def msg.msgdir pen3'conference.'def||CR
  2434.               lastread.msgdir=lstwrt-1
  2435.               lw=lstwrt-1
  2436.               msglist.lw=0
  2437.               msglist.lstwrt=1
  2438.               LEAVE mess
  2439.             END
  2440.         END
  2441.       ELSE IF msgcom='K' THEN
  2442.         DO
  2443.           IF level>sysoplevel | name=WORD(lynes.2,2) THEN
  2444.             DO
  2445.               IF getinput(1 1 'Really delete' arg'? (Ny) > ')='Y' THEN
  2446.                 DO
  2447.                   IF DELETE(arg)=1 THEN
  2448.                     SAY pen3||arg||def' has been deleted.'CR
  2449.                   grand=grand-1
  2450.                   msg.msgdir.0=msg.msgdir.0-1
  2451.                 END
  2452.             END
  2453.         END
  2454.       ELSE IF msgcom='O' THEN   /* go back and read original */
  2455.         DO
  2456.           IF WORDS(lynes.3)>3 THEN
  2457.             DO
  2458.               temp=WORD(lynes.3,4)
  2459.               arg=dirname'/'temp
  2460.             END
  2461.           ELSE SAY 'This is the original message.'CR
  2462.         END
  2463.       ELSE IF msgcom='R' THEN        /*  toname     msgnum  */
  2464.         DO
  2465.           msgnum=WORD(lynes.1,2)
  2466.           forthline=lynes.4
  2467.           IF editor('REPLY' WORD(lynes.2,2) msgnum) THEN /* reply */
  2468.             DO
  2469.               savearg2=arg
  2470.               arg=dirname'/'WORD(lynes.3,4)
  2471.               IF EXISTS(arg) THEN
  2472.                 DO
  2473.                   IF readlines(arg 1) THEN BREAK
  2474.                   xmsg=countcheck(bbspath'Numbers/LastMessage'msgdir mess)
  2475.                   IF WORDS(lynes.1)>3 THEN lynes.1=lynes.1 xmsg
  2476.                   ELSE lynes.1=lynes.1'   Reply' xmsg
  2477.                   CALL DELAY(28)    /* allow 1/2 sec for read to close */
  2478.                   CALL savelines(arg)
  2479.                 END
  2480.               arg=savearg2
  2481.             END
  2482.         END
  2483.       ELSE IF arg~=savearg THEN    /* Continue */
  2484.         DO
  2485.           msgcom='A'
  2486.           arg=savearg
  2487.         END
  2488.     END
  2489.     IF thread~='' THEN
  2490.       DO
  2491.         thread=''
  2492.         msgstatus=msgstatus+1
  2493.       END
  2494.   END
  2495.   IF msgstatus>1 THEN msgstatus=msgstatus-1
  2496. END
  2497. DROP msglist. skipsubj.
  2498. IF quietflag~=1 THEN nonstop=0
  2499. RETURN
  2500.  
  2501.  
  2502. showmarked:
  2503. ARG ff .
  2504. IF WORDS(data.24)<1 THEN RETURN
  2505. fline='These unread conference messages have been ['pen3'M'pen6']arked as addressed to you:'
  2506. IF ff THEN
  2507.   DO
  2508.     SAY CR
  2509.     SAY pen6||fline||def||CR
  2510.   END
  2511. tempkk=data.24
  2512. DO i=1 TO WORDS(tempkk)
  2513.   tempk=WORD(tempkk,i)
  2514.   PARSE VAR tempk kdir'/'kmsg
  2515.   line=RIGHT(kmsg,6) 'in the'pen3 msg.kdir def'conference'
  2516.   IF EXISTS(msgpath||tempk) THEN
  2517.     DO
  2518.       IF ff THEN SAY line'.'CR
  2519.       ELSE fline=fline'0A'x||line'.'
  2520.     END
  2521.   ELSE
  2522.     DO
  2523.       line=line 'is missing.'
  2524.       IF ff THEN SAY line||CR
  2525.       ELSE fline=fline'0A'x||line
  2526.       data.24=DELWORD(data.24,FIND(data.24,tempk),1)
  2527.     END
  2528. END
  2529. IF ff THEN
  2530.   DO
  2531.     CALL waiting()
  2532.     SAY CR
  2533.   END
  2534. ELSE
  2535.   DO
  2536.     IF writeopen(bbspath'EmailFiles/'name'/Marked')=0 THEN RETURN
  2537.     CALL WRITELN(f,fline)
  2538.     CALL CLOSE(f)
  2539.   END
  2540. RETURN
  2541.  
  2542.  
  2543. killmark:
  2544. PARSE ARG kdir kmsg .
  2545. IF data.24='' THEN RETURN
  2546. markword=FIND(data.24,kdir'/'kmsg)
  2547. IF markword>0 THEN data.24=STRIP(DELWORD(data.24,markword,1))
  2548. RETURN
  2549.  
  2550.  
  2551. readmarked:
  2552. mrknum=WORDS(data.24)
  2553. IF mrknum=0 THEN RETURN
  2554. SAY 'Reading only messages addressed to you...'CR
  2555. mrklist=data.24
  2556. msgcom=''
  2557. DO rmki=1 TO mrknum WHILE msgcom~='Q'
  2558.   tempk=WORD(mrklist,rmki)
  2559.   PARSE VAR tempk mkdir'/'mkmsg .
  2560.   IF ~EXISTS(msgpath||tempk) THEN
  2561.     DO
  2562.       CALL killmark(mkdir mkmsg)
  2563.       SAY CR
  2564.       SAY 'Message number' mkmsg 'in the' msg.mkdir 'conference is missing!'CR
  2565.       SAY CR
  2566.       ITERATE rmki
  2567.     END
  2568.   msgdir=mkdir
  2569.   savelast=lastread.msgdir
  2570.   CALL readmsg(1 mkmsg)
  2571.   IF mkmsg>savelast THEN lastread.msgdir=mkmsg
  2572.   ELSE lastread.msgdir=savelast
  2573. END
  2574. CALL saveData(1)
  2575. RETURN
  2576.  
  2577.  
  2578. sortnumbers:
  2579. PARSE ARG slist
  2580. IF STRIP(slist)='' THEN RETURN ''
  2581. sorted.=''
  2582. oldest=999999
  2583. newest=0
  2584. newlist=''
  2585. DO si=1 TO WORDS(slist)
  2586.   testword=WORD(slist,si)
  2587.   IF ~DATATYPE(testword,'W') THEN
  2588.     DO
  2589.       testpos=LASTPOS('.',testword)
  2590.       IF testpos>0 THEN tempnum=SUBSTR(testword,testpos+1)
  2591.       ELSE
  2592.         DO
  2593.           newlist=testword newlist
  2594.           ITERATE si
  2595.         END
  2596.     END
  2597.   ELSE tempnum=testword/1
  2598.   IF sorted.tempnum='' THEN
  2599.     DO
  2600.       sorted.tempnum=testword
  2601.       sorted.tempnum.0=1
  2602.       IF DATATYPE(tempnum,'W') THEN
  2603.         DO
  2604.           IF tempnum>newest THEN newest=tempnum
  2605.           IF tempnum<oldest THEN oldest=tempnum
  2606.         END
  2607.     END
  2608.   ELSE newlist=newlist testword
  2609. END
  2610. IF oldest~=999999 & newest~=0 THEN
  2611.   DO si=oldest TO newest
  2612.     IF sorted.si.0=1 THEN newlist=newlist sorted.si
  2613.   END
  2614. DROP sorted. oldest newest
  2615. RETURN STRIP(newlist)
  2616.  
  2617.  
  2618. readmail:
  2619. ARG fromenu .
  2620. CALL postuser(3)
  2621. replysubj=''
  2622. IF fromenu THEN
  2623.   DO
  2624.     temp=UPPER(arg)
  2625.     arg=''
  2626.     IF temp~='F' & temp~='T' & temp~='W' THEN
  2627.       DO
  2628.         line='Find Email ['pen3'F'def']rom You ['pen3'T'def']o You or ['pen3'W'def']rite New Email (ftw) > 'def
  2629.         temp=getinput(1 1 line)
  2630.         CALL cleanline(0)
  2631.       END
  2632.     IF temp='W' THEN
  2633.       DO
  2634.         CALL editor('MAIL')
  2635.         RETURN
  2636.       END
  2637.     ELSE IF temp='F' THEN
  2638.       DO
  2639.         firsteditline=0
  2640.         picklist.=''
  2641.         picklist.0=0
  2642.         IF getinput(1 1 'Check ALL users? (nY) > ')='N' THEN
  2643.           DO
  2644.             picklist.1=getinput(1 0 'Check EMail From' name 'To Who? > ')
  2645.             picklist.1=SPACE(STRIP(UPPER(picklist.1)),1,'_')
  2646.             picklist.1=COMPRESS(picklist.1,'.,:/*#?^ ')
  2647.             IF picklist.1='' THEN RETURN
  2648.             IF FIND(userlist,picklist.1)=0 THEN
  2649.               DO
  2650.                 SAY '***'pen3 picklist.1 def'does not exist!'||CR
  2651.                 picklist.0=0
  2652.                 RETURN
  2653.               END
  2654.             fmaillist=SHOWDIR(bbspath'EMail/'picklist.1)
  2655.             DO ej=1 TO WORDS(fmaillist)
  2656.               ejname=WORD(fmaillist,ej)
  2657.               uname=ejname
  2658.               caret=LASTPOS('.',uname)
  2659.               IF caret>2 THEN uname=LEFT(uname,caret-1)
  2660.               IF uname=name THEN
  2661.                 DO
  2662.                   arg=bbspath'EMail/'picklist.1'/'ejname
  2663.                   IF EXISTS(arg) THEN
  2664.                     DO
  2665.                       pklst=picklist.0+1
  2666.                       picklist.pklst=picklist.1
  2667.                       picklist.pklst.0=ejname
  2668.                       picklist.0=pklst
  2669.                     END
  2670.                 END
  2671.             END
  2672.             IF picklist.0=0 THEN SAY 'No Email FROM you was found.'||CR
  2673.             ELSE
  2674.               DO
  2675.                 SAY pen3'You have the following Email pending:'def||CR
  2676.                 pickcheck=1
  2677.                 DO WHILE pickcheck~=0
  2678.                   pickcheck=pickfromlist()
  2679.                   IF pickcheck~=0 THEN
  2680.                     DO
  2681.                       firsteditline=5
  2682.                       IF level>sysoplevel THEN firsteditline=1
  2683.                       CALL bbsED(firsteditline bbspath'Email/'picklist.pickcheck'/'picklist.pickcheck.0)
  2684.                       IF ~EXISTS(bbspath'Email/'picklist.pickcheck'/'picklist.pickcheck.0) THEN
  2685.                         picklist.pickcheck='- KILLED -'
  2686.                     END
  2687.                 END
  2688.               END
  2689.           END
  2690.         ELSE
  2691.           DO
  2692.             users=WORDS(userlist)
  2693.             SAY pen3'Scanning'def users pen3'email directories...'def||CR
  2694.             SAY pen3' - To ABORT, press CTRL-E -'def||CR
  2695.             DO wi=1 TO users
  2696.               CALL busywait(60 wi users)
  2697.               fmaillist=SHOWDIR(bbspath'EMail/'WORD(userlist,wi))
  2698.               DO ej=1 TO WORDS(fmaillist)
  2699.                 ejname=WORD(fmaillist,ej)
  2700.                 uname=ejname
  2701.                 caret=LASTPOS('.',uname)
  2702.                 IF caret>2 THEN uname=LEFT(uname,caret-1)
  2703.                 IF uname=name THEN
  2704.                   DO
  2705.                     arg=bbspath'EMail/'WORD(userlist,wi)'/'ejname
  2706.                     IF EXISTS(arg) THEN
  2707.                       DO
  2708.                         pklst=picklist.0+1
  2709.                         picklist.pklst=WORD(userlist,wi)
  2710.                         picklist.pklst.0=ejname
  2711.                         picklist.0=pklst
  2712.                       END
  2713.                   END
  2714.               END
  2715.               IF wi=999999 THEN RETURN
  2716.             END
  2717.             CALL busywait(4 0)
  2718.             IF picklist.0=0 THEN SAY lineup'No Email FROM you was found.                  'CR
  2719.             ELSE
  2720.               DO
  2721.                 SAY pen3'You have Email pending to the following users:'def||CR
  2722.                 pickcheck=1
  2723.                 DO WHILE pickcheck~=0
  2724.                   pickcheck=pickfromlist()
  2725.                   IF pickcheck~=0 THEN
  2726.                     DO
  2727.                       firsteditline=5
  2728.                       IF level>sysoplevel THEN firsteditline=1
  2729.                       CALL bbsED(firsteditline bbspath'Email/'picklist.pickcheck'/'picklist.pickcheck.0)
  2730.                       IF ~EXISTS(bbspath'Email/'picklist.pickcheck'/'picklist.pickcheck.0) THEN
  2731.                         picklist.pickcheck='- KILLED -'
  2732.                     END
  2733.                 END
  2734.               END
  2735.           END
  2736.         DROP picklist.
  2737.         RETURN
  2738.       END
  2739.     ELSE IF temp='T' THEN BREAK
  2740.     ELSE RETURN
  2741.   END
  2742. SAY 'Checking your mailbox...'CR
  2743. nomail=1
  2744. CALL MAKEDIR(bbspath'EMail/'name)
  2745. mailist=sortnumbers(SHOWDIR(bbspath'Email/'name))
  2746. IF WORDS(mailist)=0 THEN
  2747.   DO
  2748.     SAY lineup'Your mailbox is empty.  'CR
  2749.     SAY CR
  2750.     RETURN
  2751.   END
  2752. line=WORDS(mailist)
  2753. IF line>1 THEN line=line 'letters'
  2754. ELSE line=line 'letter'
  2755. line=line 'waiting.'
  2756. SAY line||CR
  2757. DO ii=1 TO WORDS(mailist)
  2758.   SAY 'Email:' pen3||WORD(mailist,ii)||def||CR
  2759. END
  2760. IF ~fromenu THEN
  2761.   IF getinput(1 1 'Read your private mail now? (nY) > ')='N' THEN RETURN
  2762. onename=''
  2763. IF WORDS(mailist)>3 THEN
  2764.   DO
  2765.     IF getinput(1 1 'Read all private mail? (nY) > ')='N' THEN
  2766.       DO
  2767.         onename=getinput(1 0 'Read ONLY private mail from? > ')
  2768.         onename=SPACE(STRIP(UPPER(onename)),1,'_')
  2769.         onename=COMPRESS(onename,'.,:/*#?^ ')
  2770.         IF onename='' THEN RETURN
  2771.         IF FIND(userlist,onename)=0 & picklist.1~='BBBBS' THEN
  2772.           DO
  2773.             SAY '***'pen3 onename def'does not exist!'||CR
  2774.             RETURN
  2775.           END
  2776.       END
  2777.   END
  2778. DO letter=1 TO WORDS(mailist)
  2779.   readname=WORD(mailist,letter)
  2780.   uname=readname
  2781.   caret=LASTPOS('.',uname)
  2782.   IF caret>2 THEN uname=LEFT(uname,caret-1)
  2783.   IF onename~='' & onename~=uname THEN ITERATE letter
  2784.   arg=bbspath'Email/'name'/'readname        /* user has mail! */
  2785.   CALL readlines(arg 1)
  2786.   delnum=WORD(lynes.1,2)
  2787.   CALL seelines(1)
  2788.   nomail=0
  2789.   nonstop=0
  2790.   mailfile=''
  2791.   IF UPPER(WORD(lynes.1,3))='FILE:' THEN mailfile=WORD(lynes.1,4)
  2792.   ELSE IF UPPER(WORD(lynes.2,3))='FILE:' THEN mailfile=WORD(lynes.2,4)
  2793.   IF mailfile~='' & readname~='NEW_FILES' & readname~='FILELISTS_REPORT' & readname~='INACTIVE_USERS' & LEFT(readname,3)~='MSG' THEN
  2794.     DO
  2795.       IF LEFT(RIGHT(mailfile,4),1)~='.' & LEFT(readname,6)='BBBBS.' THEN
  2796.         DO
  2797.           SAY CR
  2798.           SAY pen3'The attached file is unarchived and may be incomplete.'CR
  2799.           SAY 'If the archiver is still building this file, downloading will fail.'def||CR
  2800.           IF getinput(1 1 'Do you want to try to download it anyway? (Ny) > ')~='Y' THEN ITERATE letter
  2801.           SAY CR
  2802.         END
  2803.       curdir=PRAGMA('D')
  2804.       CALL setdir(bbspath'EmailFiles/'name)
  2805.       filesize=WORD(STATEF(mailfile),2)
  2806.       IF getinput(1 1 ' Attached file:' pen3||mailfile||def 'is' pen3||filesize||def 'bytes.  Download now? (nY) > ')~='N' THEN
  2807.         DO
  2808.           savearg=arg
  2809.           allargs=bbspath'EmailFiles/'name'/'mailfile
  2810.           DO WHILE dload2()=1
  2811.           END
  2812.           arg=savearg
  2813.           CALL readlines(arg 1)
  2814.         END
  2815.       CALL setdir(curdir)
  2816.     END
  2817.   IF readname~='NEW_FILES' & readname~='FILELISTS_REPORT' & readname~='INACTIVE_USERS' & LEFT(readname,3)~='MSG' & LEFT(readname,6)~='BBBBS.' THEN
  2818.     DO
  2819.       tempchar='A'
  2820.       DO WHILE tempchar='A'
  2821.         tempchar=getinput(1 1 '['pen3'A'def']gain  ['pen3'C'def']ontinue  ['pen3'R'def']eply (acR) > ')
  2822.         IF tempchar='' THEN tempchar='R'
  2823.         IF tempchar='A' THEN CALL seelines(1)
  2824.       END
  2825.       IF tempchar='R' THEN
  2826.         DO
  2827.           IF WORDS(lynes.4)<2 THEN replysubj='NONE'
  2828.           ELSE replysubj=SUBSTR(lynes.4,WORDINDEX(lynes.4,2))
  2829.           CALL editor('MAIL' uname)
  2830.           replysubj=''
  2831.         END
  2832.     END
  2833.   IF LEFT(readname,6)~='BBBBS.' THEN
  2834.     DO
  2835.       tempchar='A'
  2836.       DO WHILE tempchar='A'
  2837.         tempchar=getinput(1 1 'Forward mail from'pen3 uname def'to other users? (aNy) > ')
  2838.         IF tempchar='A' THEN CALL seelines(1)
  2839.       END
  2840.       IF tempchar='Y' THEN
  2841.         DO
  2842.           IF selectchosen(1 pen3'Forward Email To: 'def)=0 THEN
  2843.             DO ei=1 TO thechosen.0 WHILE thechosen.ei~=''
  2844.               CALL MAKEDIR(bbspath'EMail/'thechosen.ei)
  2845.               forwardarg=bbspath'Email/'thechosen.ei'/'readname
  2846.               ADDRESS COMMAND 'C:COPY' bbspath'Email/'name'/'readname forwardarg
  2847.               CALL readlines(forwardarg 1)
  2848.               lynes.1=lynes.1'  Forwarded to you by' name TIME('C') DATE()
  2849.               CALL DELETE(forwardarg)
  2850.               CALL savelines(forwardarg)
  2851.               IF WORDS(lynes.2)>3 THEN
  2852.                 DO
  2853.                   forname=bbspath'EmailFiles/'name'/'WORD(lynes.2,4)
  2854.                   IF EXISTS(forname) THEN
  2855.                     DO
  2856.                       CALL MAKEDIR(bbspath'EmailFiles/'thechosen.ei)
  2857.                       ADDRESS COMMAND 'C:COPY' forname bbspath'EmailFiles/'thechosen.ei
  2858.                     END
  2859.                 END
  2860.               line='Mail' pen3||readname||def 'forwarded to' pen3||thechosen.ei||def
  2861.               IF emailonline>=0 THEN emailonline=emailonline+1
  2862.               CALL send2log(line)
  2863.               SAY line||CR
  2864.             END
  2865.         END
  2866.     END
  2867.   tempchar=''
  2868.   tempstr='Delete the email ('pen3||delnum||def') from'pen3 uname def'that you just read?'
  2869.   IF mailfile='' THEN tempchar=getinput(1 1 tempstr '(nqY) > ')
  2870.   ELSE
  2871.     DO WHILE tempchar~='N' & tempchar~='Q' & tempchar~='Y'
  2872.       tempchar=getinput(1 1 tempstr '(nqy) > ')
  2873.     END
  2874.   IF tempchar='Q' THEN
  2875.     DO
  2876.       IF getinput(1 1 'Quit reading your Email? (Ny) > ')='Y' THEN
  2877.         DO
  2878.           readname=''
  2879.           uname=''
  2880.           RETURN
  2881.         END
  2882.     END
  2883.   ELSE IF tempchar~='N' THEN
  2884.     DO
  2885.       dirname=bbspath'Email/'name'/'
  2886.       nodelete=0
  2887.       IF bbsprefs.14=1 & name~=sysop & uname~=sysop & WORD(lynes.2,2)~='BBBBS' & WORD(lynes.2,2)~=sysop & WORD(lynes.3,2)~=sysop THEN
  2888.         nodelete=1
  2889.       IF nodelete THEN
  2890.         ADDRESS COMMAND 'C:Copy' dirname||readname bbspath'Email/'sysop
  2891.       ELSE emailonline=emailonline-1
  2892.       CALL DELETE(dirname||readname)
  2893.       tempstr='Old email'
  2894.       IF mailfile~='' & readname~='NEW_FILES' & readname~='FILELISTS_REPORT' & readname~='INACTIVE_USERS' & EXISTS(bbspath'EmailFiles/'name'/'mailfile) THEN
  2895.         DO
  2896.           IF nodelete THEN
  2897.             ADDRESS COMMAND 'C:Copy' bbspath'EmailFiles/'name'/'mailfile bbspath'EmailFiles/'sysop
  2898.           CALL DELETE(bbspath'EmailFiles/'name'/'mailfile)
  2899.           CALL DELETE(bbspath'EmailFiles/'name'/'mailfile'.xdl')
  2900.           tempstr=tempstr 'and attached file'
  2901.         END
  2902.       tempstr=tempstr 'deleted. Thank you for keeping a clean BBS!'
  2903.       SAY tempstr||CR
  2904.       IF tempchar='Q' THEN
  2905.         IF getinput(1 1 'Quit reading your Email? (Ny) > ')='Y' THEN
  2906.           DO
  2907.             readname=''
  2908.             uname=''
  2909.             RETURN
  2910.           END
  2911.     END
  2912.   ELSE IF LEFT(readname,3)='MSG' & level>sysoplevel THEN
  2913.     DO
  2914.       ii=LEFT(readname,POS('.',readname)-1)
  2915.       ii=SUBSTR(ii,4)%1
  2916.       IF getinput(1 1 'Move this message back to the' msg.ii 'conference? (nY) > 'def)~='N' THEN
  2917.         DO
  2918.           temp=TRANSLATE(readname,'/','.')
  2919.           temp=SUBSTR(temp,4)
  2920.           lynes.1='!!'STRIP(lynes.1)
  2921.           edtype=''
  2922.           CALL savelines(msgpath||temp)
  2923.           CALL DELETE(bbspath'Email/'name'/'readname)
  2924.         END
  2925.     END
  2926.   ELSE IF LEFT(readname,3)~='MSG' & readname~='NEW_FILES' & readname~='FILELISTS_REPORT' & readname~='INACTIVE_USERS' THEN
  2927.     DO
  2928.       arg=bbspath'Email/'name'/'readname
  2929.       CALL readlines(arg 1)
  2930.       IF WORDS(lynes.5)<7 THEN
  2931.         DO
  2932.           lynes.5=lynes.5'  (Rcvd)' DATE('W') DATE() TIME('C')
  2933.           CALL DELETE(arg)
  2934.           CALL savelines(arg)
  2935.           SAY 'Email has been marked as received.'CR
  2936.         END
  2937.     END
  2938.   CALL checktime()
  2939.   readname=''
  2940.   uname=''
  2941.   arg=''
  2942. END
  2943. IF nomail THEN
  2944.   DO
  2945.     SAY 'No mail was found.'CR
  2946.     CALL waiting()
  2947.   END
  2948. CALL setdir(libpath||dirs.1)
  2949. thechosen.=''
  2950. RETURN
  2951.  
  2952.  
  2953. selectchosen:
  2954. PARSE ARG startat selectline
  2955. IF startat<2 THEN thechosen.=''
  2956. line='Enter list of comma separated user names'
  2957. IF level>sysoplevel THEN line=line 'or ALL'
  2958. SAY line||CR
  2959. thechosen.startat=getinput(1 0 selectline' ')
  2960. IF STRIP(thechosen.startat)='' THEN RETURN 1
  2961. thechosen.startat=SPACE(thechosen.startat,1,'_')
  2962. thechosen.0=startat
  2963. IF level>sysoplevel & thechosen.startat='ALL' THEN
  2964.   thechosen.startat=SHOWDIR(bbspath'Users','F',',')
  2965. IF POS(',',thechosen.startat)>0 THEN
  2966.   DO
  2967.     temp=TRANSLATE(thechosen.startat,' ',',')
  2968.     thechosen.0=thechosen.0+WORDS(temp)-1
  2969.     DO ei=1 TO WORDS(temp)
  2970.       eii=startat+ei-1
  2971.       thechosen.eii=STRIP(WORD(temp,ei))
  2972.     END
  2973.   END
  2974. DO ei=startat TO thechosen.0
  2975.   DO WHILE FIND(userlist,thechosen.ei)=0
  2976.     IF thechosen.ei~='' THEN
  2977.       DO
  2978.         IF FIND(exclusion,thechosen.ei)>0 | thechosen.ei='BBBBS' THEN
  2979.           DO
  2980.             thechosen.ei=sysop
  2981.             ITERATE ei
  2982.           END
  2983.         CALL loadcourtesy()
  2984.         IF FIND(courtesy,thechosen.ei)>0 THEN ITERATE ei
  2985.       END
  2986.     SAY thechosen.ei 'not found! Enter that name again or press RETURN.'CR
  2987.     thechosen.ei=getinput(1 0 pen3||selectline' 'def)
  2988.     IF thechosen.ei='' THEN
  2989.       DO
  2990.         IF getinput(1 1 'Do you want to see the list of current users? (Ny) > ')='Y' THEN
  2991.           CALL showuserlist()
  2992.         ITERATE ei
  2993.       END
  2994.     thechosen.ei=SPACE(thechosen.ei,1,'_')
  2995.   END
  2996. END
  2997. RETURN 0
  2998.  
  2999.  
  3000. countcheck:
  3001. PARSE ARG fname' 'cknum' '.
  3002. IF ~EXISTS(fname) THEN
  3003.   DO
  3004.     IF cknum=0 THEN RETURN 0
  3005.     IF ~writeopen(fname) THEN RETURN 0
  3006.     CALL WRITELN(f,cknum)
  3007.     CALL CLOSE(f)
  3008.     RETURN cknum
  3009.   END
  3010. IF ~readopen(fname) THEN RETURN cknum
  3011. retval=STRIP(READLN(f))
  3012. CALL CLOSE(f)
  3013. IF ~DATATYPE(retval,'W') THEN retval=0
  3014. IF ~DATATYPE(cknum,'W') THEN cknum=0
  3015. IF retval<cknum THEN
  3016.   DO
  3017.     IF writeopen(fname) THEN
  3018.       DO
  3019.         CALL WRITELN(f,cknum)
  3020.         CALL CLOSE(f)
  3021.         RETURN cknum
  3022.       END
  3023.   END
  3024. RETURN retval
  3025.  
  3026.  
  3027. pickfromlist:
  3028. DO pfl=1 TO picklist.0 BY 3
  3029.   pfl2=pfl+1
  3030.   pfl3=pfl+2
  3031.   pfline=pen3||RIGHT(pfl,3)||def LEFT(picklist.pfl,21)
  3032.   IF picklist.pfl2~='' THEN
  3033.     pfline=pfline pen3||RIGHT(pfl2,3)||def LEFT(picklist.pfl2,21)
  3034.   IF picklist.pfl3~='' THEN
  3035.     pfline=pfline pen3||RIGHT(pfl3,3)||def LEFT(picklist.pfl3,21)
  3036.   SAY pfline||CR
  3037. END
  3038. emnum=getinput(1 0 pen3'Select Email Number > 'def)
  3039. IF ~DATATYPE(emnum,'W') | emnum<1 | emnum>picklist.0 THEN RETURN 0
  3040. RETURN emnum
  3041.  
  3042.  
  3043. sysED:
  3044. IF level<99 THEN RETURN
  3045. arg=getinput(0 0 'Textfile To Edit: ')
  3046. IF arg='' THEN RETURN
  3047. CALL bbsED(1 arg)
  3048. RETURN
  3049.  
  3050.  
  3051. bbsED:
  3052. PARSE ARG firstedit editarg .
  3053. notchanged=1
  3054. IF readlines(editarg 1) THEN RETURN 1
  3055. finfo=STATEF(editarg)
  3056. IF WORDS(finfo)>7 THEN finfo=SUBSTR(finfo,WORDINDEX(finfo,8))
  3057. ELSE finfo=''
  3058. SAY CR
  3059. SAY '                   'pen3'Entering the EDITOR module..'def||CR
  3060. SAY CR
  3061. count=1
  3062. DO edloop=1
  3063.   IF edcom='S' & bbsprefs.5 THEN  /* spell check */
  3064.     DO
  3065.       SAY pen3'You must use ['def'R'pen3']eplace to make corrections.  'pen2'Spellchecking...'def||CR
  3066.       CALL DELETE(scratch'/SpellFile')
  3067.       CALL savelines(scratch'/SpellFile')
  3068.       curdir=PRAGMA('D')
  3069.       CALL setdir(spellpath)
  3070.       CALL SpellChk.rexx(scratch'/SpellFile')
  3071.       CALL setdir(curdir)
  3072.     END
  3073.   ELSE
  3074.     DO
  3075.       IF edcom='R' | edcom='I' | edcom='L' THEN CALL wrapbuf(7)
  3076.       IF edcom~='L' THEN count=count-linesperpage
  3077.       IF count>=lynes.0 | count<1 THEN count=1
  3078.       startcount=count
  3079.       DO i=startcount TO lynes.0+1
  3080.         IF ((i+1-startcount)//linesperpage)=0 THEN
  3081.           DO
  3082.             pline='                 ['pen3'E'def']dit'
  3083.             pline=pline '  ['pen3'RETURN'def']=Continue '
  3084.             edcom=getinput(1 1 pline)
  3085.             IF edcom~='' THEN LEAVE i
  3086.             CALL cleanline(1)
  3087.           END
  3088.         SAY pen3||RIGHT(i,3)||def lynes.i||CR
  3089.         count=count+1
  3090.       END
  3091.     END
  3092.   CALL checktime()
  3093.   SAY lineup'     ['pen3'A'def']ppend ['pen3'C'def']ut     ['pen3'I'def']nsert  ['pen3'K'def']ill       ['pen3'?'def'] Help'CR
  3094.   pline='     ['pen3'L'def']ist   ['pen3'P'def']aste   ['pen3'R'def']eplace'
  3095.   IF bbsprefs.5 THEN pline=pline '['pen3'S'def']pellcheck'
  3096.   pline=pline '['pen3'U'def']pload-Text > '
  3097.   edcom=getinput(1 0 pline)
  3098.   IF edcom='Q' | edcom='X' THEN edcom=''
  3099.   IF edcom='?' THEN
  3100.     DO
  3101.       SAY CR
  3102.       SAY '                   Editor Help'CR
  3103.       SAY '----------------------------------------------------------'CR
  3104.       SAY '    an empty RETURN tells the editor you are done editing.'CR
  3105.       SAY ' 7  edits line number 7, if it exists.'CR
  3106.       SAY ' a  Append text to this file.'CR
  3107.       SAY ' c  Cut selected line(s) of text to buffer.'CR
  3108.       SAY ' i  Insert blank line.'CR
  3109.       SAY ' k  Kill (delete) this file.'CR
  3110.       SAY ' l  List this file from selected line.'CR
  3111.       SAY ' p  Paste buffer contents to selected line number.'CR
  3112.       SAY ' r  Replace a phrase or line of text.'CR
  3113.       SAY ' s  Spellcheck this file.'CR
  3114.       SAY ' u  Upload a textfile to append to this file.'CR
  3115.       SAY '----------------------------------------------------------'CR
  3116.       SAY CR
  3117.       OPTIONS PROMPT ''
  3118.       PULL
  3119.     END
  3120.   IF edcom='K' THEN
  3121.     DO
  3122.       junk=getinput(1 1 'Are you' pen3'sure'def 'you want to delete' editarg'? (Ny) > ')
  3123.       IF junk='Y' THEN
  3124.         DO
  3125.           IF DELETE(editarg)=1 THEN SAY editarg 'DELETED.'CR
  3126.           IF WORD(lynes.1,1)='Mail:' & WORDS(lynes.2)>3 THEN
  3127.             DO
  3128.               IF DELETE(bbspath'EmailFiles/'WORD(lynes.3,2)'/'WORD(lynes.2,4))=1 THEN
  3129.                 SAY WORD(lynes.2,4) 'DELETED.'CR
  3130.             END
  3131.           RETURN 2
  3132.         END
  3133.     END
  3134.   IF edcom='' THEN
  3135.     DO
  3136.       SAY '                   'pen3'Leaving the EDITOR module.'def||CR
  3137.       IF notchanged THEN RETURN 0
  3138.       IF getinput(1 1 '                     Save changes? (nY)'pen3' > 'def)='N' THEN
  3139.         RETURN 1
  3140.       CALL DELETE(editarg)
  3141.       IF savelines(editarg) THEN RETURN 1
  3142.       CALL DELAY(28)
  3143.       IF finfo~='' THEN ADDRESS COMMAND 'C:filenote' editarg finfo
  3144.       SAY pen3'                        Changes saved.'def||CR
  3145.       RETURN 0
  3146.     END
  3147.   ELSE IF edcom='C' THEN  /* Cut */
  3148.     DO
  3149.       firstnum=getinput(1 0 '   Enter line number or range 'pen3'(5-7)'def' to cut' pen3'>'def)
  3150.       IF firstnum='' THEN ITERATE edloop
  3151.       dash=POS('-',firstnum)
  3152.       IF dash>0 THEN
  3153.         DO
  3154.           lastnum=STRIP(SUBSTR(firstnum,dash+1))
  3155.           firstnum=STRIP(LEFT(firstnum,dash-1))
  3156.         END
  3157.       ELSE lastnum=firstnum
  3158.       IF ~DATATYPE(firstnum,'W') | ~DATATYPE(lastnum,'W') THEN
  3159.         DO
  3160.           junk=getinput(1 1 pen3'*** You must enter numbers here! 'def)
  3161.           ITERATE edloop
  3162.         END
  3163.       IF lastnum>lynes.0 THEN lastnum=lynes.0
  3164.       IF firstnum<firstedit THEN
  3165.         DO
  3166.           SAY '*** You are not authorized to delete that line!'CR
  3167.           SAY CR
  3168.           ITERATE edloop
  3169.         END
  3170.       IF firstnum>lastnum THEN
  3171.         DO
  3172.           SAY '*** Input error!  First number larger than last number.'CR
  3173.           ITERATE edloop
  3174.         END
  3175.       notchanged=0
  3176.       numdiff=lastnum+1-firstnum
  3177.       pasted.=''
  3178.       pasted.0=numdiff
  3179.       k=0
  3180.       DO i=firstnum TO lynes.0
  3181.         j=i+numdiff
  3182.         k=k+1
  3183.         IF k<=numdiff THEN pasted.k=lynes.i
  3184.         lynes.i=lynes.j
  3185.         lynes.j=''
  3186.       END
  3187.       lynes.0=lynes.0-numdiff
  3188.       count=1
  3189.     END
  3190.   ELSE IF edcom='A' THEN  /* append */
  3191.     DO
  3192.       CALL writebuffer(scratch'/EditorFile')
  3193.       notchanged=0
  3194.     END
  3195.   ELSE IF edcom='U' THEN  /* Upload a textfile to append */
  3196.     DO
  3197.       CALL txup(1)
  3198.       notchanged=0
  3199.     END
  3200.   ELSE IF edcom='I' | edcom='R' | edcom='L' | edcom='P' | DATATYPE(edcom,'W') THEN
  3201.     DO
  3202.       IF DATATYPE(edcom,'W') THEN
  3203.         DO
  3204.           ednum=edcom
  3205.           edcom='R'
  3206.         END
  3207.       ELSE
  3208.         DO
  3209.           line=pen3'   '
  3210.           IF edcom='L' | edcom='P' THEN line=line'Starting '
  3211.           line=line'Line Number? > 'def
  3212.           ednum=getinput(1 0 line)
  3213.         END
  3214.       IF ~DATATYPE(ednum,'W') THEN ITERATE edloop
  3215.       IF ednum>(lynes.0+1) THEN ITERATE edloop
  3216.       IF edcom='L' THEN
  3217.         DO
  3218.           count=ednum
  3219.           ITERATE edloop
  3220.         END
  3221.       IF ednum=1 & UPPER(WORD(lynes.1,1))='FILE:' THEN
  3222.         DO
  3223.           IF getinput(1 1 pen3'Edit KeyWords:? (Ny) > 'def)='Y' THEN
  3224.             DO
  3225.               filenum=STRIP(WORD(lynes.1,2))
  3226.               num=files.filenum.0
  3227.               keywords=edkeywords(editarg)
  3228.               lynes.1=LEFT(lynes.1,21) keywords
  3229.               alpha.num=TRIM(OVERLAY(keywords,alpha.num,47,32))
  3230.               savefileflag=1
  3231.               notchanged=0
  3232.               ITERATE edloop
  3233.             END
  3234.         END
  3235.       IF ednum<firstedit THEN
  3236.         DO
  3237.           SAY '*** You are not authorized to alter that line!'CR
  3238.           SAY CR
  3239.           ITERATE edloop
  3240.         END
  3241.       IF edcom='R' THEN   /* replace */
  3242.         DO
  3243.           SAY '   Now reads:'CR
  3244.           SAY pen3||RIGHT(ednum,2)||def lynes.ednum||CR
  3245.           OPTIONS PROMPT pen3'........Search text? >'def
  3246.           PARSE PULL stext
  3247.           IF LENGTH(stext)=0 THEN
  3248.             DO
  3249.               IF getinput(1 1 lineup||pen3'Replace entire line? (nY) >'def)='N' THEN
  3250.                 ITERATE edloop
  3251.               lynes.ednum=getinput(0 0 pen3||RIGHT(ednum,2)' 'def)
  3252.               notchanged=0
  3253.               ITERATE edloop
  3254.             END
  3255.           found=POS(UPPER(stext),UPPER(lynes.ednum))
  3256.           IF found=0 THEN
  3257.             DO
  3258.               SAY CR
  3259.               SAY stext' was not found!'CR
  3260.               SAY CR
  3261.               ITERATE edloop
  3262.             END
  3263.           OPTIONS PROMPT pen3'...Replacement text? >'def
  3264.           PARSE PULL rtext
  3265.           lynes.ednum=DELSTR(lynes.ednum,found,LENGTH(stext))
  3266.           lynes.ednum=INSERT(rtext,lynes.ednum,found-1)
  3267.           IF ednum<4 & LEFT(lynes.1,6)='File: ' THEN
  3268.             DO
  3269.               PARSE VAR lynes.1 'File: 'filenum . 'KeyWords: 'keywords
  3270.               PARSE VAR lynes.3 . 'Lib:' libnam
  3271.               filenum=STRIP(filenum)
  3272.               newc=files.filenum.0
  3273.               libnum=finddirnum(libnam)
  3274.               alpha.newc=LEFT(WORD(lynes.2,2),22-LENGTH(WORD(lynes.2,4)))
  3275.               alpha.newc=alpha.newc WORD(lynes.2,4) RIGHT(filenum,5)
  3276.               alpha.newc=alpha.newc RIGHT(libnum,2) LEFT(STRIP(libnam),12)
  3277.               alpha.newc=alpha.newc STRIP(LEFT(STRIP(keywords),32))
  3278.               savefileflag=1
  3279.             END
  3280.           SAY 'Done.'CR
  3281.           SAY CR
  3282.           notchanged=0
  3283.         END
  3284.       ELSE IF edcom='I' THEN  /* insert */
  3285.         DO
  3286.           DO i=lynes.0 TO ednum BY -1
  3287.             j=i+1
  3288.             lynes.j=lynes.i
  3289.           END
  3290.           lynes.ednum=''
  3291.           notchanged=0
  3292.           lynes.0=lynes.0+1
  3293.           lynes.ednum=getinput(0 0 pen3||RIGHT(ednum,2)'>'def)
  3294.         END
  3295.       ELSE IF edcom='P' THEN   /* paste */
  3296.         DO
  3297.           DO i=lynes.0 TO ednum BY -1
  3298.             j=i+pasted.0
  3299.             lynes.j=lynes.i
  3300.           END
  3301.           DO k=1 TO pasted.0
  3302.             kk=ednum+k-1
  3303.             lynes.kk=pasted.k
  3304.           END
  3305.           notchanged=0
  3306.           lynes.0=lynes.0+pasted.0
  3307.         END
  3308.     END
  3309. END
  3310. RETURN 0
  3311.  
  3312.  
  3313. editor:
  3314. toname=''
  3315. msgnum=0
  3316. thechosen.=''
  3317. PARSE ARG edtype toname msgnum .
  3318. IF edtype='MAIL' THEN lastwrit=countcheck(bbspath'Numbers/LastMail 0')
  3319. ELSE 
  3320.   DO
  3321.     IF edtype='MSG' THEN
  3322.       DO
  3323.         tempmsgdir=0
  3324.         IF DATATYPE(arg,'W') THEN tempmsgdir=arg
  3325.         IF tempmsgdir>0 & tempmsgdir<=level & msg.tempmsgdir~='' THEN
  3326.           msgdir=tempmsgdir
  3327.         ELSE IF areaselect() THEN RETURN
  3328.       END
  3329.     lastwrit=countcheck(bbspath'Numbers/LastMessage'msgdir 0)
  3330.   END
  3331. IF toname='' THEN
  3332.   DO
  3333.     IF edtype='MAIL' THEN
  3334.       DO
  3335.         CALL selectchosen(1 pen3'Send PRIVATE' edtype lastwrit+1 'To: 'def)
  3336.         toname=thechosen.1
  3337.       END
  3338.     ELSE toname=getinput(1 0 pen3'Post A PUBLIC Message To: 'def)
  3339.   END
  3340. toname=SPACE(toname,1,'_')
  3341. toname=cleanstring(1':'toname)
  3342. IF toname='' | FIND(exclusion,toname)>0 THEN
  3343.   DO
  3344.     IF toname='' & edtype='MSG' THEN toname='ALL'
  3345.     ELSE toname=sysop
  3346.     SAY pen3'*** Re-Addressed to'def toname||CR
  3347.   END
  3348. IF toname~='ALL' THEN
  3349.   DO
  3350.     IF toname='BBBBS' THEN toname=sysop
  3351.     IF FIND(userlist,toname)=0 THEN
  3352.       DO
  3353.         IF courtesy='' THEN CALL loadcourtesy()
  3354.         IF FIND(courtesy,toname)=0 THEN
  3355.           DO
  3356.             SAY CR
  3357.             SAY bak2' 'toname' is not on the user list! 'def||CR
  3358.             IF edtype='MAIL' THEN
  3359.               DO
  3360.                 CALL showuserlist()
  3361.                 RETURN 0
  3362.               END
  3363.             ELSE
  3364.               DO
  3365.                 IF getinput(1 1 'Do you want to use it anyway? (nY) > ')='N' THEN
  3366.                   DO
  3367.                     IF getinput(1 1 'Do you want to see the list of current users? (Ny) > ')='Y' THEN
  3368.                       CALL showuserlist()
  3369.                     RETURN 0
  3370.                   END
  3371.               END
  3372.           END
  3373.       END
  3374.   END
  3375. IF toname=sysop THEN CALL sound('FEEDBACK')
  3376. ELSE CALL sound('MESSAGE')
  3377. IF edtype='MAIL' THEN
  3378.   DO
  3379.     CALL MAKEDIR(bbspath'EMail/'toname)
  3380.     mailname=bbspath'EMail/'toname'/'name'.'lastwrit+1
  3381.   END
  3382. ELSE
  3383.   DO
  3384.     CALL MAKEDIR(msgpath||msgdir)
  3385.     mailname=msgpath||msgdir'/'lastwrit+1
  3386.   END
  3387. lynes.=''
  3388. lynes.0=6
  3389. IF edtype='MAIL' THEN lynes.1=' Mail:' lastwrit+1  /* FILE: filename */
  3390. ELSE lynes.1='  Msg:' lastwrit+1          /* Msg: MSG# REPLY # # ... */
  3391. lynes.2=' From:' name
  3392. IF city~='' THEN lynes.2=lynes.2' - 'city
  3393. lynes.3='   To:' toname                       /*  To: toname   MSG # */
  3394. IF edtype='MAIL' THEN
  3395.   DO
  3396.     IF readopen(bbspath||'Users/'toname) THEN
  3397.       DO
  3398.         CALL READLN(f)
  3399.         CALL READLN(f)
  3400.         temp=READLN(f)
  3401.         CALL CLOSE(f)
  3402.         temp=docity(temp)
  3403.         IF temp~='' THEN lynes.3=lynes.3' - 'temp
  3404.       END
  3405.     IF replysubj='|@NEW@|' THEN
  3406.       DO
  3407.         CALL readlines(bbspath'BBS_TEXT/EMAIL_WELCOME' 7)
  3408.         replysubj='Welcome to' bbsname
  3409.       END
  3410.   END
  3411. subj=''
  3412. IF edtype='REPLY' THEN
  3413.   DO
  3414.     subj=SUBSTR(forthline,WORDINDEX(forthline,2))
  3415.     SAY pen3'Subj:'def subj||CR
  3416.     temp=getinput(0 0 'Change the current subject? (Ny) > ')
  3417.     IF LENGTH(temp)>3 THEN subj=temp
  3418.     ELSE IF LEFT(UPPER(temp),1)='Y' THEN subj=''
  3419.   END
  3420. ELSE IF edtype='MAIL' & replysubj~='' THEN subj=replysubj
  3421. IF subj='' THEN
  3422.   DO
  3423.     IF opt='C' THEN subj='FEEDBACK'
  3424.     ELSE
  3425.       DO
  3426.         SAY pen3'Enter the'def 'Subject' pen3'of this message (1 line).'def||CR
  3427.         subj=getinput(0 0 pen3': 'def)
  3428.       END
  3429.   END
  3430. IF LENGTH(subj)>66 THEN subj=LEFT(subj,66)
  3431. IF subj='' THEN subj='?'
  3432. lynes.4=' Subj:' subj
  3433. lynes.5=' Date:' DATE('W') DATE()'  'TIME('C')
  3434. IF edtype~='MAIL' THEN lynes.5=LEFT(lynes.5,39) 'Conference:' msg.msgdir
  3435. lynes.6=LEFT('',74,'=')
  3436. IF edtype='REPLY' THEN lynes.3=lynes.3'  MSG 'msgnum
  3437. DO i=1 TO lynes.0
  3438.   SAY lynes.i||CR
  3439. END
  3440. CALL writebuffer(scratch'/MessageFile')
  3441. IF savelines(mailname) THEN RETURN 0
  3442. CALL seelines(1)
  3443. IF thechosen.0='' THEN
  3444.   DO
  3445.     thechosen.0=1
  3446.     thechosen.1=toname
  3447.   END
  3448. carbons=thechosen.0+1
  3449. DO FOREVER
  3450.   IF thechosen.0>=carbons THEN
  3451.     DO
  3452.       junk='Copies To:'
  3453.       DO cci=carbons TO thechosen.0
  3454.         junk=junk thechosen.cci
  3455.       END
  3456.       SAY junk||CR
  3457.     END
  3458.   pline=''
  3459.   IF edtype='MAIL' THEN pline='['pen3'C'def']opies'
  3460.   pline=STRIP(pline '['pen3'E'def']dit ['pen3'K'def']ill ['pen3'R'def']ead')
  3461.   pline=pline '['pen3'U'def']pload-Text ['pen3'S'def']end' edtype'? (ekrSu) 'def
  3462.   junk=getinput(1 1 pline)
  3463.   IF junk='E' THEN
  3464.     DO
  3465.       IF level>sysoplevel THEN firstedit=1
  3466.       ELSE firstedit=7
  3467.       IF bbsED(firstedit mailname)=2 THEN RETURN 0
  3468.       junk='R'
  3469.     END
  3470.   ELSE IF edtype='MAIL' & junk='C' THEN
  3471.     DO
  3472.       CALL selectchosen(carbons pen3'Carbon Copies To: 'def)
  3473.       junk='R'
  3474.     END
  3475.   ELSE IF junk='K' THEN
  3476.     DO
  3477.       IF DELETE(mailname)=1 THEN SAY edtype 'DELETED.'CR
  3478.       RETURN 0
  3479.     END
  3480.   ELSE IF junk='U' THEN
  3481.     DO
  3482.       CALL txup(0 mailname)
  3483.       junk='R'
  3484.     END
  3485.   IF junk='R' THEN
  3486.     DO
  3487.       CALL readlines(mailname 1)
  3488.       CALL seelines(1)
  3489.       nonstop=0
  3490.     END
  3491.   ELSE BREAK
  3492. END
  3493. IF edtype='MAIL' THEN
  3494.   DO
  3495.     IF replysubj~='' & readname~='' & LEFT(readname,5)~='BBBBS' & uname~='' & uname~='UNAME' THEN
  3496.       DO
  3497.         junk=getinput(1 1 'Attach original mail from' uname'? (nY) > ')
  3498.         IF junk~='N' THEN
  3499.           DO
  3500.             arg=bbspath'Email/'name'/'readname
  3501.             IF ~readlines(arg 1) THEN CALL savelines(mailname)
  3502.           END
  3503.       END
  3504.     junk=getinput(1 1 pen3'Attach a file to this message? (Ny) > 'def)
  3505.     IF junk='Y' THEN
  3506.       DO
  3507.         savearg=arg
  3508.         arg=getinput(0 0 'Filename: ')
  3509.         curdir=PRAGMA('D')
  3510.         CALL MAKEDIR(bbspath'EmailFiles/'toname)
  3511.         CALL setdir(bbspath'EmailFiles/'toname)
  3512.         DO WHILE uload(0)=2
  3513.         END
  3514.         IF WORD(STATEF(bbspath'EmailFiles/'toname'/'arg),2)>1 THEN
  3515.           DO
  3516.             CALL readlines(mailname 1)
  3517.             IF arg~='' THEN lynes.1=lynes.1'  FILE: 'arg
  3518.             CALL setdir(curdir)
  3519.             CALL DELETE(mailname)
  3520.             CALL savelines(mailname)
  3521.           END
  3522.         ELSE
  3523.           DO
  3524.             CALL DELETE(bbspath'EmailFiles/'toname'/'arg)
  3525.             SAY pen3'*** Upload failed! ***'def||CR
  3526.           END
  3527.         arg=savearg
  3528.       END
  3529.     totmail=WORD(data.17,2)
  3530.     IF ~DATATYPE(totmail,'W') THEN totmail=1
  3531.     ELSE totmail=totmail+1
  3532.     data.17=WORD(data.17,1)'  'totmail'  'WORD(data.17,3)
  3533.   END
  3534. IF edtype~='MAIL' THEN totwrit.msgdir=totwrit.msgdir+1
  3535. CALL readlines(mailname 1)
  3536. DO ui=1 TO thechosen.0
  3537.   IF thechosen.ui='' THEN ITERATE ui
  3538.   IF ui>1 THEN
  3539.     DO
  3540.       CALL MAKEDIR(bbspath'Email/'thechosen.ui)
  3541.       newname=bbspath'Email/'thechosen.ui'/'name'.'lastwrit+1
  3542.       IF ui<carbons THEN lynes.3='   To:' thechosen.ui
  3543.       ELSE
  3544.         DO
  3545.           lynes.1=lynes.1'  (Carbon Copy)'
  3546.           lynes.3='   To:' thechosen.1
  3547.         END
  3548.       CALL savelines(newname)
  3549.       IF WORDS(lynes.1)>3 & EXISTS(bbspath'EmailFiles/'thechosen.1'/'WORD(lynes.1,4)) THEN
  3550.         DO
  3551.           CALL MAKEDIR(bbspath'EmailFiles/'thechosen.ui)
  3552.           ADDRESS COMMAND 'C:COPY' bbspath'EmailFiles/'thechosen.1'/'WORD(lynes.1,4) bbspath'EmailFiles/'thechosen.ui
  3553.           line2='Copied' WORD(lynes.1,4)
  3554.           SAY line2 'to the' thechosen.ui 'file area.'CR
  3555.           CALL send2log(line2)
  3556.         END
  3557.     END
  3558.   line=edtype':'lastwrit+1 'at' TIME('C') 'to' thechosen.ui
  3559.   IF edtype~='MAIL' THEN
  3560.     DO
  3561.       IF FIND(userlist,thechosen.ui)>0 THEN
  3562.         CALL msgmark(thechosen.ui msgdir lastwrit+1)
  3563.       line=line 'in' msg.msgdir
  3564.     END
  3565.   CALL send2log(line)
  3566.   line=edtype 'Sent To' thechosen.ui
  3567.   IF edtype='MAIL' THEN
  3568.     DO
  3569.       IF emailonline>=0 THEN emailonline=emailonline+1
  3570.     END
  3571.   ELSE
  3572.     DO
  3573.       grand=grand+1
  3574.       IF ~DATATYPE(msg.msgdir.0,'W') THEN msg.msgdir.0=1
  3575.       ELSE msg.msgdir.0=msg.msgdir.0+1
  3576.       line=line 'in the'pen3 msg.msgdir def'conference.'
  3577.     END
  3578.   SAY line||CR
  3579. END
  3580. IF edtype='MAIL' THEN CALL countcheck(bbspath'Numbers/LastMail' lastwrit+1)
  3581. ELSE CALL countcheck(bbspath'Numbers/LastMessage'msgdir lastwrit+1)
  3582. CALL setdir(libpath||dirs.1)
  3583. thechosen.=''
  3584. RETURN 1
  3585.  
  3586.  
  3587. txup:
  3588. PARSE ARG upflg uparg .
  3589. SAY 'Ready to append' pen3'TEXT ONLY'def 'using'pen3 protocol||def||CR
  3590. pline='Are you SURE your file is un-compressed text? (Ny) > '
  3591. IF getinput(1 1 pline)='Y' THEN
  3592.   DO
  3593.     savearg=arg
  3594.     arg='UploadFile'
  3595.     curdir=PRAGMA('D')
  3596.     CALL setdir(scratch)
  3597.     CALL DELETE(arg)
  3598.     CALL DELETE('tempfile1')
  3599.     IF uload(0)=0 THEN
  3600.       DO
  3601.         IF upflg=0 THEN
  3602.           DO
  3603.             ADDRESS COMMAND 'C:copy' uparg 'tempfile1'
  3604.             CALL DELETE(uparg)
  3605.             ADDRESS COMMAND 'C:join tempfile1 UploadFile AS' uparg
  3606.           END
  3607.         ELSE IF upflg=1 THEN
  3608.           DO
  3609.             CALL readlines(arg lynes.0+1)
  3610.             notchanged=0
  3611.           END
  3612.       END
  3613.     CALL setdir(curdir)
  3614.     arg=savearg
  3615.   END
  3616. RETURN
  3617.  
  3618.  
  3619. msgmark:
  3620. PARSE ARG markname markdir markmsg .
  3621. IF OPEN(f,bbspath'Users/'markname,'R')=0 THEN RETURN
  3622. mlines.=''
  3623. DO mi=1
  3624.   temp=READLN(f)
  3625.   IF EOF(f) THEN LEAVE mi
  3626.   mlines.mi=STRIP(temp)
  3627. END
  3628. CALL CLOSE(f)
  3629. mlines.0=mi-1
  3630. CALL DELAY(28)
  3631. mlines.24=STRIP(mlines.24 markdir'/'markmsg)
  3632. IF OPEN(f,bbspath'Users/'markname,'W')=0 THEN RETURN
  3633. DO mi=1 TO mlines.0
  3634.   CALL WRITELN(f,mlines.mi)
  3635. END
  3636. CALL CLOSE(f)
  3637. RETURN
  3638.  
  3639.  
  3640. shell:
  3641. SAY CR
  3642. olddir=PRAGMA('D')
  3643. DO WHILE(UPPER(opt)~='EXIT')
  3644.   SAY bak2||TIME('C')||def PRAGMA('D')||CR
  3645.   OPTIONS PROMPT pen3'Type EXIT to quit AmigaDOS> 'def
  3646.   PARSE PULL opt' 'arg
  3647.   CALL checkdcd()
  3648.   IF(UPPER(opt)='CD') THEN CALL setdir(arg)
  3649.   ELSE IF exists(opt)~=0 THEN
  3650.     DO
  3651.       IF LEFT(STATEF(opt),3)='DIR' THEN CALL setdir(opt)
  3652.     END
  3653.   ELSE IF opt~='' & UPPER(opt)~='EXIT' THEN
  3654.     ADDRESS COMMAND opt '<* >*' arg
  3655. END
  3656. CALL PRAGMA('D',olddir)
  3657. RETURN
  3658.  
  3659.  
  3660. yell:
  3661. chatrequest=1
  3662. IF excuses.1='' THEN
  3663.   DO
  3664.     IF readopen(bbspath'Lists/Excuses') THEN
  3665.       DO
  3666.         DO i=1
  3667.           line=READLN(f)
  3668.           IF EOF(f) THEN BREAK
  3669.           excuses.i=line
  3670.         END
  3671.         excuses.0=i-1
  3672.         CALL CLOSE(f)
  3673.       END
  3674.   END
  3675. j=TIME('S')//excuses.0+1
  3676. SAY CR
  3677. SAY 'Sorry, your SysOp,' sysop','CR
  3678. IF excuses.j~='' THEN SAY excuses.j||CR
  3679. ELSE SAY 'is not available, please leave a ['pen3'C'def']omment.'CR
  3680. SAY CR
  3681. IF bbsprefs.13 THEN RETURN
  3682. SAY 'I''m yelling anyway...'CR
  3683. SAY 'If nobody answers, please try again later or leave a ['pen3'C'def']omment'CR
  3684. CALL sound('YELL')
  3685. ADDRESS AREXX bbsSpeak.rexx 'CHAT' name bbspath saypath
  3686. RETURN
  3687.  
  3688.  
  3689. /* online change to member. Sysop triggered by BumpMember.baud */
  3690. /* user triggered by Call Back Verification CBV: */
  3691. validate:
  3692. ARG varg .
  3693. IF readopen(bbspath'BBS_TEXT/'varg) THEN
  3694.   DO
  3695.     SAY CR
  3696.     SAY 'You are being validated.  Please wait...'CR
  3697.     SAY CR
  3698.     DO lvi=1 TO 22
  3699.       line=READLN(f)
  3700.       IF lvi=11 THEN data.11=line
  3701.       IF lvi=20 THEN data.20=line
  3702.     END
  3703.     data.22=line
  3704.     CALL CLOSE(f)
  3705.     CALL SetData()
  3706.     CALL sortlibraries()
  3707.     IF bbsprefs.25=1 THEN
  3708.       DO
  3709.         data.22=''
  3710.         data.23=''
  3711.         SAY CR
  3712.         SAY 'Setting message counters to last 10 messages in each conference...'CR
  3713.         DO i=1 TO level
  3714.           num=countcheck(bbspath'Numbers/LastMessage'i 0)-10
  3715.           IF num<0 | msg.i.0<10 THEN num=0
  3716.           lastread.i=num
  3717.           data.22=data.22 num
  3718.           data.23=data.23 0
  3719.         END
  3720.         SAY 'Setting file counter to last file uploaded...'CR
  3721.         lastbrowse=countcheck(bbspath'Numbers/LastFile' 0)
  3722.         newfilesdate='19900101 00:00:00'
  3723.       END
  3724.     SAY CR
  3725.     CALL logonstats()
  3726.     CALL saveData(0)
  3727.     IF EXISTS(bbspath'BBS_TEXT/EMAIL_WELCOME') THEN
  3728.       DO
  3729.         CALL MAKEDIR(bbspath'EMail/'name)
  3730.         lastwrit=countcheck(bbspath'Numbers/LastMail' 0)+1
  3731.         IF lastwrit>1 THEN CALL countcheck(bbspath'Numbers/LastMail' lastwrit)
  3732.         lynes.=''
  3733.         lynes.1=' Mail:' lastwrit
  3734.         lynes.2=' From:' sysop
  3735.         lynes.3='   To:' name
  3736.         lynes.4=' Subj: Welcome to' bbsname
  3737.         lynes.5=' Date:' DATE('W') DATE()'  'TIME('C')
  3738.         lynes.6=LEFT('',74,'=')
  3739.         CALL readlines(bbspath'BBS_TEXT/EMAIL_WELCOME' 7)
  3740.         CALL savelines(bbspath'EMail/'name'/'sysop'.'lastwrit)
  3741.         SAY 'You have welcoming EMail.'CR
  3742.       END
  3743.     CALL waiting()
  3744.     IF bbsprefs.22=2 THEN
  3745.       DO
  3746.         SAY CR
  3747.         SAY pen3||name def'is now a fully valadated member of'pen3 bbsname||def||CR
  3748.         SAY 'All the features of the BBS will be available on your next call.'CR
  3749.         SAY CR
  3750.         CALL waiting()
  3751.         SIGNAL LOGOUT2
  3752.       END
  3753.     SIGNAL RESTART
  3754.   END
  3755. ELSE
  3756.   DO
  3757.     SAY 'Sorry. Auto-validation is disabled.'CR
  3758.     temp=' ***' sysop'!  You need a default file in BBS_TEXT!  (' varg ') *** '
  3759.     MSG bak2||temp||def||CR
  3760.     CALL Send2log(temp)
  3761.   END
  3762. RETURN
  3763.  
  3764.  
  3765. /* online time change. Sysop triggered by BumpTime.baud */
  3766. uptime:
  3767. mins=GETCLIP('BBS_minutes')
  3768. IF DATATYPE(mins,'N') THEN
  3769.   DO
  3770.     IF (mins*60)>maxtime THEN
  3771.       SAY name', this session''s time has been increased to' mins 'minutes.'CR
  3772.     ELSE MSG '*** User has not been told that his time has decreased.'
  3773.     CALL SETCLIP('BBS_minutes')
  3774.     maxtime=mins*60
  3775.   END
  3776. RETURN
  3777.  
  3778.  
  3779. /* online level change. Sysop triggered by BumpLevels.baud */
  3780. uplevel:
  3781. levl=GETCLIP('BBS_level')
  3782. IF DATATYPE(levl,'W') THEN
  3783.   DO
  3784.     IF levl>data.20 THEN
  3785.       SAY name', your level has been changed from' data.20 'to' levl'.'CR
  3786.     ELSE MSG '*** User has not been told his level has been reduced.'
  3787.     data.20=levl
  3788.     CALL SetData()
  3789.     IF menu='NEW' THEN menu='ALL'
  3790.     CALL sortlibraries()
  3791.   END
  3792. RETURN
  3793.  
  3794.  
  3795. /* online ratio change. Sysop triggered by BumpLevels.baud */
  3796. upratio:
  3797. rats=GETCLIP('BBS_ratio')
  3798. IF DATATYPE(rats,'W') THEN
  3799.   DO
  3800.     SAY name', your upload:download ratio has been changed to 1:'rats'.'CR
  3801.     data.17=rats'  'WORD(data.17,2)'  'WORD(data.17,3)
  3802.     CALL SETCLIP('BBS_ratio')
  3803.   END
  3804. RETURN
  3805.  
  3806.  
  3807. bytes2user:
  3808. PARSE ARG indx bytes .
  3809. tfiles=WORD(data.indx,1)
  3810. tbytes=WORD(data.indx,3)
  3811. IF ~DATATYPE(tfiles,'W') THEN tfiles=0
  3812. IF ~DATATYPE(tbytes,'W') THEN tbytes=0
  3813. tbytes=tbytes+bytes
  3814. tfiles=tfiles+1
  3815. IF tfiles>1 THEN data.indx=tfiles 'files' tbytes 'bytes.'
  3816. ELSE data.indx='1 file' bytes 'bytes.'
  3817. data.indx=data.indx DATE()
  3818. CALL saveData(0)
  3819. RETURN
  3820.  
  3821.  
  3822. stats:
  3823. ARG indx
  3824. tfail=''
  3825. bytes=''
  3826. Status z
  3827. string=RESULT
  3828. IF RIGHT(BB_VERS,4)>1.59 THEN
  3829.   DO
  3830.     PARSE VAR string . 'Local Name: 'temp . 'Xfer''ed: 'bytes . 'Elapsed Time: 'min':'sec'0A'x .
  3831.     slash=LASTPOS('/',temp)
  3832.     IF slash=0 THEN slash=LASTPOS(':',temp)
  3833.     IF slash~=0 THEN temp=SUBSTR(temp,slash+1)
  3834.   END
  3835. ELSE PARSE VAR string temp' 'min':'sec . 'Bytes:'bytes .
  3836. temp=STRIP(temp)
  3837. min=STRIP(min)
  3838. sec=STRIP(sec)
  3839. bytes=STRIP(bytes)
  3840. IF temp~='' & LEFT(UPPER(STRIP(temp)),8)~=LEFT(UPPER(arg),8) THEN
  3841.   tfail='wrong file' temp
  3842. ELSE IF DATATYPE(min,'W') & DATATYPE(sec,'W') & DATATYPE(bytes,'W') THEN
  3843.   DO
  3844.     secs=(min*60)+sec
  3845.     IF indx=14 THEN CALL DELAY(100) /* wait for dos to finish upload */
  3846.     temp=STATEF(PRAGMA('D')'/'arg)
  3847.     temp=WORD(temp,2)
  3848.     IF ~DATATYPE(temp,'W') THEN temp=0
  3849.     IF indx=14 & (temp+1024)<bytes THEN tfail='ul size'
  3850.     IF indx=15 & temp>(bytes+1024) THEN tfail='dl size'
  3851.   END
  3852. ELSE tfail='not numeric: min='min 'sec='sec 'bytes='bytes
  3853. IF tfail~='' THEN
  3854.   DO
  3855.     line=plaindir'/'arg pen3'*** Transfer failed! ***'def
  3856.     SAY line||CR
  3857.     CALL send2log(line 'tfail:'tfail)
  3858.     CALL send2log('***' string)
  3859.     CALL sound('TFAIL')
  3860.     IF indx=14 & WORD(STATEF(arg),2)=0 THEN CALL DELETE(arg)
  3861.     RETURN 1
  3862.   END
  3863. ELSE IF secs>0 THEN
  3864.   Say 'Transfer Speed:' TRUNC(bytes/secs+.05,1) 'characters per second.'CR
  3865. Remote OFF
  3866. Send '^G'
  3867. Remote ON
  3868. line=left(arg,16,' ')
  3869. IF indx=14 THEN
  3870.   DO
  3871.     temp=countcheck(bbspath'Numbers/Bytes.UpLoad' 0)+bytes
  3872.     CALL countcheck(bbspath'Numbers/Bytes.UpLoad' temp)
  3873.     line=line 'uled'
  3874.   END
  3875. ELSE
  3876.   DO
  3877.     temp=countcheck(bbspath'Numbers/Bytes.DownLoad' 0)+bytes
  3878.     CALL countcheck(bbspath'Numbers/Bytes.DownLoad' temp)
  3879.     temp=countcheck(bbspath'Numbers/Files.DownLoad' 0)+1
  3880.     CALL countcheck(bbspath'Numbers/Files.DownLoad' temp)
  3881.     temp=PRAGMA('D')
  3882.     xdev=SPACE(LEFT(temp,POS(':',temp)-1),1,'_')
  3883.     tfiles=1
  3884.     IF EXISTS(arg'.xdl') THEN
  3885.       DO
  3886.         IF readopen(arg'.xdl') THEN
  3887.           DO
  3888.             xdev=READLN(f)
  3889.             tfiles=READLN(f)
  3890.             CALL CLOSE(f)
  3891.           END
  3892.       END
  3893.     temp=countcheck(bbspath'Numbers/Bytes.X.'xdev 0)+bytes
  3894.     CALL countcheck(bbspath'Numbers/Bytes.X.'xdev temp)
  3895.     temp=countcheck(bbspath'Numbers/Files.X.'xdev 0)+tfiles
  3896.     CALL countcheck(bbspath'Numbers/Files.X.'xdev temp)
  3897.     line=line 'dled'
  3898.   END
  3899. line=line protocol TIME('C') bytes 'bytes' PRAGMA('D')
  3900. CALL send2log(line)
  3901. RETURN 0
  3902.  
  3903.  
  3904. bbsspace:
  3905. ARG tabspace .
  3906. ADDRESS COMMAND 'C:info >ram:infout' bbsdevice
  3907. ok=OPEN(f,'ram:infout','R')
  3908. IF ok=0 THEN RETURN 20
  3909. line=READLN(f)
  3910. line=READLN(f)
  3911. line=READLN(f)
  3912. line=READLN(f)
  3913. CALL CLOSE(f)
  3914. IF tabspace<14 THEN SAY CR
  3915. bbsk=WORD(line,4)
  3916. IF ~DATATYPE(bbsk,'N') THEN
  3917.   DO
  3918.     line=bbsdevice 'is not an info compatible device!'
  3919.     CALL send2log(line)
  3920.     SAY pen3||line||def||CR
  3921.     bbsk=0
  3922.     RETURN
  3923.   END
  3924. bbsk=bbsk*512-SYSTEM_SPACE_LIMIT
  3925. IF bbsk<1 THEN bbsk=0
  3926. SAY RIGHT(comma(bbsk),tabspace) 'bytes available for uploads.'CR
  3927. RETURN
  3928.  
  3929.  
  3930. comma:
  3931. ARG num .
  3932. dgt=LENGTH(num)
  3933. numtext=''
  3934. IF dgt>3 THEN numtext=','RIGHT(num,3)
  3935. IF dgt>6 THEN numtext=','LEFT(RIGHT(num,6),3)||numtext
  3936. IF dgt>9 THEN numtext=','LEFT(RIGHT(num,9),3)||numtext
  3937. IF dgt>12 THEN
  3938.   DO
  3939.     numtext=','LEFT(RIGHT(num,12),3)||numtext
  3940.     numtext=LEFT(num,dgt-12)||numtext
  3941.   END
  3942. ELSE IF dgt>9 THEN numtext=LEFT(num,dgt-9)||numtext
  3943. ELSE IF dgt>6 THEN numtext=LEFT(num,dgt-6)||numtext
  3944. ELSE IF dgt>3 THEN numtext=LEFT(num,dgt-3)||numtext
  3945. ELSE numtext=num
  3946. RETURN numtext
  3947.  
  3948.  
  3949. is_here:
  3950. ARG newname 
  3951. CALL WRITECH(STDOUT,'Checking filelist')
  3952. DO wi=1 TO 99
  3953.   IF wi//3=0 THEN CALL WRITECH(STDOUT,'.')
  3954.   IF dirs.wi='' THEN ITERATE wi
  3955.   IF ~EXISTS(bbspath'FileNotes/'dirs.wi'/'newname) THEN ITERATE wi
  3956.   line=pen3'*** File' newname 'already exists here'
  3957.   IF wi<=level THEN line=line 'in the' dirs.wi 'directory'
  3958.   line=line'.'def
  3959.   SAY CR
  3960.   SAY line||CR
  3961.   SAY 'Original uploader should ['pen3'K'def']ill the file before uploading the replacement.'CR
  3962.   CALL waiting()
  3963.   RETURN 1
  3964. END
  3965. SAY CR
  3966. CALL cleanline(1)
  3967. RETURN 0
  3968.  
  3969.  
  3970. uload:
  3971. ARG frommenu
  3972. IF frommenu THEN
  3973.   DO
  3974.     SAY CR
  3975.     SAY pen3'PLEASE!'def 'Only upload 1 (one) archive at a time. NO BATCH UPLOADING! Thanks.'CR
  3976.   END
  3977. CALL bbsspace(12)
  3978. SAY CR
  3979. IF bbsk<1 THEN
  3980.   DO
  3981.     line='Upload area is full!'
  3982.     CALL send2log(line)
  3983.     SAY pen3||line||def||CR
  3984.     RETURN 1
  3985.   END
  3986. IF arg='' THEN arg=getinput(0 0 'Filename: ')  /* no filename given */
  3987. arg=cleanstring('0:'arg)
  3988. arg=COMPRESS(arg,' :/,;|#?*')  /* be sure no illegals here */
  3989. x=LASTPOS('/',arg)
  3990. IF x=0 THEN x=LASTPOS(':',arg)
  3991. IF x>0 THEN
  3992.   DO
  3993.     IF DATATYPE(SUBSTR(arg,x+1),'W') THEN
  3994.       DO
  3995.         SAY 'Whole numbers are not allowed as filenames!'CR
  3996.         CALL waiting()
  3997.         RETURN 1
  3998.       END
  3999.   END
  4000. tempnum=LENGTH(arg)-16
  4001. DO WHILE tempnum>0 & POS('EMAILFILES',UPPER(PRAGMA('D')))=0
  4002.   temp='          'pen3||arg def'is'pen3 tempnum||def
  4003.   IF tempnum=1 THEN temp=temp 'character'
  4004.   ELSE temp=temp 'characters'
  4005.   temp=temp 'too long for a filename.'
  4006.   SAY temp||CR
  4007.   arg=getinput(0 0 'Filename: ')
  4008.   arg=cleanstring('0:'arg)
  4009.   arg=COMPRESS(arg,' :/,;|#?*()+[]"{}')
  4010.   tempnum=LENGTH(arg)-16
  4011. END
  4012. IF arg='' THEN RETURN 1
  4013. IF frommenu THEN
  4014.   DO
  4015.     IF is_here(arg) THEN RETURN 1
  4016.     IF wi=999999 THEN RETURN 1
  4017.     IF bbsprefs.6=1 & sysoplevel>level THEN CALL setdir(libpath'Sysops')
  4018.     ELSE
  4019.       DO loop=1
  4020.         SAY 'Please select an appropriate library for -' pen3||arg def'-'CR
  4021.         temp=chdir()
  4022.         IF temp=0 THEN LEAVE loop
  4023.         IF temp=2 THEN RETURN 1
  4024.       END
  4025.   END
  4026. checkproto='T'
  4027. targ=arg
  4028. DO WHILE checkproto='T'
  4029.   arg=''
  4030.   SAY CR
  4031.   SAY 'Library:'pen3 plaindir def'  Filename:'pen3 targ def'  Protocol:'pen3 protocol||def||CR
  4032.   pline=' ['pen3'Q'def']uit ['pen3'T'def']ransfer-protocol'
  4033.   pline=pline '['pen3'U'def']pload (qtU) > '
  4034.   checkproto=getinput(1 1 pline)
  4035.   IF checkproto='Q' THEN RETURN 1
  4036.   IF checkproto='T' THEN CALL chpro()
  4037. END
  4038. arg=targ
  4039. CALL postuser(4)
  4040. CALL sound('UPLOAD')
  4041. uploadtime=TIME('E')
  4042. SAY 'Starting' protocol 'transfer.  Press' pen3'Esc'def 'to abort.'CR
  4043. CALL whodat()
  4044. DownLoad arg
  4045. IF RC>0 | stats(14) THEN RETURN 2
  4046. rbytes=WORD(STATEF(arg),2)
  4047. IF rbytes<1 THEN
  4048.   DO
  4049.     CALL DELETE(arg)
  4050.     RETURN 2
  4051.   END
  4052. temp=''
  4053. DO WHILE temp~='N' & temp~='Y'
  4054.   temp=getinput(1 1 'Received' rbytes 'bytes. Was your upload successful? (ny) > ')
  4055. END
  4056. IF temp='N' THEN RETURN 2
  4057. IF TestArc.rexx(PRAGMA('D')'/'arg)>0 THEN
  4058.   DO
  4059.     SAY CR
  4060.     SAY pen3'***'def arg pen3'failed archive check!'def||CR
  4061.     SAY CR
  4062.     temp=getinput(1 1 'Do you believe the archive checker made a mistake? (Ny) > ')
  4063.     IF temp~='Y' THEN
  4064.       DO
  4065.         CALL DELETE(arg)
  4066.         SAY CR
  4067.         RETURN 2
  4068.       END
  4069.   END
  4070. CALL bytes2user(14 rbytes)
  4071. ADDRESS AREXX bbsNewFile.rexx name PRAGMA('D')'/'arg
  4072. IF bbsprefs.9 & name~=sysop THEN
  4073.   DO
  4074.     newufile=bbspath'EMail/'sysop'/NEW_FILES'
  4075.     IF EXISTS(newufile) THEN ok=OPEN(f,newufile,'A')
  4076.     ELSE
  4077.       DO
  4078.         ok=OPEN(f,newufile,'W')
  4079.         IF ok~=0 THEN CALL WRITELN(f,'*** New Files ***') 
  4080.       END
  4081.     IF ok~=0 THEN CALL WRITELN(f,name 'uploaded' plaindir'/'arg'  'DATE() TIME())
  4082.     CALL CLOSE(f)
  4083.     CALL sound('NEW_FILE')
  4084.   END
  4085. IF POS('EMAILFILES',UPPER(PRAGMA('D')))>0 THEN RETURN 0
  4086. DO ui=sysoplevel+2 TO 100
  4087.   IF UPPER(dirs.ui)=UPPER(plaindir) THEN RETURN 0     /* no filenotes */
  4088. END
  4089. IF frommenu THEN
  4090.   DO
  4091.     uploadtime=TIME('E')-uploadtime
  4092.     IF bbsprefs.11 THEN
  4093.       DO
  4094.         maxtime=maxtime+uploadtime
  4095.         line='This session''s time has been increased by'
  4096.         line=line TRUNC(uploadtime%60+.05,1)+1 'minutes.'
  4097.         SAY CR
  4098.         SAY line||CR
  4099.       END
  4100.     DO WHILE editnote(arg)  /* INSIST on a filenote */
  4101.     END
  4102.     SAY pen3'Thank you for contributing to the' bbsname 'file libraries!'def||CR
  4103.   END
  4104. waitchar=''
  4105. RETURN 0
  4106.  
  4107.  
  4108. findfiles:
  4109. PARSE ARG ffile .
  4110. IF POS('EMAILFILES',UPPER(PRAGMA('D')))>0 THEN RETURN ffile
  4111. wi=0
  4112. IF DATATYPE(ffile,'W') THEN
  4113.   DO
  4114.     IF WORDS(files.ffile)<2 THEN RETURN 0
  4115.     dirtemp=WORD(files.ffile,1)
  4116.     IF finddirnum(dirtemp)>level | FIND(data.21,UPPER(dirtemp))>0 THEN
  4117.       DO
  4118.         CALL illegal_access()
  4119.         RETURN 0
  4120.       END
  4121.     CALL setdir(libpath||dirtemp)
  4122.   END
  4123. ELSE IF EXISTS(ffile) THEN
  4124.   DO
  4125.     IF EXISTS(bbspath'FileNotes/'plaindir'/'ffile) THEN
  4126.       DO
  4127.         IF readopen(bbspath'FileNotes/'plaindir'/'ffile)~=0 THEN
  4128.           DO
  4129.             line=READLN(f)
  4130.             CALL CLOSE(f)
  4131.             ffile=WORD(line,2)
  4132.           END
  4133.       END
  4134.   END
  4135. ELSE IF EXISTS(bbspath'Information'ffile) THEN
  4136.   RETURN bbspath'Information/'ffile
  4137. ELSE
  4138.   DO
  4139.     nextfilenum=countcheck(bbspath'Numbers/LastFile' 0)+1
  4140.     CALL busywait(4 1)
  4141.     DO ni=nextfilenum TO 0 BY -1
  4142.       IF ni=0 THEN
  4143.         DO
  4144.           CALL busywait(4 0)
  4145.           SAY CR
  4146.           SAY '***' files.0 'filenames scanned,'pen3 ffile def'is not on the filelist!'CR
  4147.           SAY CR
  4148.           RETURN 0
  4149.         END
  4150.       IF ni>1 THEN CALL busywait(60 ni nextfilenum)
  4151.       argtemp=WORD(files.ni,2)
  4152.       IF UPPER(argtemp)=UPPER(ffile) THEN
  4153.         DO
  4154.           dirtemp=WORD(files.ni,1)
  4155.           jj=files.ni.0
  4156.           IF WORD(alpha.jj,4)>level | FIND(data.21,UPPER(dirtemp))>0 THEN
  4157.             DO
  4158.               CALL busywait(4 0)
  4159.               CALL illegal_access()
  4160.               RETURN 0
  4161.             END
  4162.           ffile=ni
  4163.           CALL setdir(libpath||dirtemp)
  4164.           LEAVE ni
  4165.         END
  4166.     END
  4167.     CALL busywait(4 0)
  4168.   END
  4169. IF wi=999999 THEN RETURN 0
  4170. ftemp=ffile
  4171. IF DATATYPE(ftemp,'W') THEN ftemp=WORD(files.ftemp,2)
  4172. IF ~EXISTS(ftemp) THEN
  4173.   DO
  4174.     finfo=STATEF(bbspath'FileNotes/'plaindir'/'ftemp)
  4175.     IF WORDS(finfo)>7 THEN ftemp=WORD(finfo,8)
  4176.     IF ~EXISTS(ftemp) THEN
  4177.       DO
  4178.         IF finfo='' THEN SAY '***'pen3 PRAGMA('D')'/'ftemp def'was not found!'CR
  4179.         ELSE
  4180.           DO
  4181.             SAY CR
  4182.             IF WORDS(finfo)<8 THEN ftemp=plaindir'/'ftemp
  4183.             SAY '***'pen3 ftemp def'is not currently available online.'CR
  4184.             SAY ' Would you like me to notify the sysop'CR
  4185.             SAY ' that you''d like to receive this file?'CR
  4186.             IF getinput(1 1 ' (Ny) > ')='Y' THEN
  4187.               DO
  4188.                 enum=countcheck(bbspath'Numbers/LastMail' 0)+1
  4189.                 CALL countcheck(bbspath'Numbers/LastMail' enum)
  4190.                 IF writeopen(bbspath'email/'sysop'/'name'.'enum)=0 THEN RETURN
  4191.                 CALL WRITELN(f,' Mail: 'enum )
  4192.                 CALL WRITELN(f,' From: 'name)
  4193.                 CALL WRITELN(f,'   To: 'sysop)
  4194.                 CALL WRITELN(f,' Subj: File Request')
  4195.                 CALL WRITELN(f,' Date: 'DATE()'  'TIME('C'))
  4196.                 CALL WRITELN(f,'====================================================================')
  4197.                 CALL WRITELN(f,' Mr. Sysop, I would like to have this file : ')
  4198.                 CALL WRITELN(f,' 'ftemp)
  4199.                 CALL WRITELN(f,' ')
  4200.                 CALL CLOSE(f)
  4201.                 SAY CR
  4202.                 ADDRESS AREXX bbsSpeak.rexx 'FILE_REQUEST' name bbspath saypath
  4203.                 SAY 'Your file request has been sent!'CR
  4204.                 SAY 'The file should be in your Email soon.'CR
  4205.               END
  4206.             SAY CR
  4207.           END
  4208.         RETURN 0
  4209.       END
  4210.   END
  4211. RETURN ffile
  4212.  
  4213.  
  4214. illegal_access:
  4215. SAY CR
  4216. SAY '*** You are not authorized to access' ffile'!'CR
  4217. SAY '*** Send Email to' sysop 'to receive a higher level.'CR
  4218. SAY CR
  4219. IF DATATYPE(ffile,'W') THEN ffile=ffile WORD(files.ffile,2)
  4220. CALL send2log('Illegal Access Attempt!' ffile 'in' dirtemp)
  4221. RETURN
  4222.  
  4223.  
  4224. statuscheck:
  4225. PARSE ARG ffile
  4226. updownratio=WORD(data.17,1)
  4227. IF ~DATATYPE(updownratio,'N') THEN updownratio=100
  4228. upbytes=WORD(data.14,3)
  4229. IF ~DATATYPE(upbytes,'W') | upbytes<1 THEN upbytes=1
  4230. dnbytes=WORD(data.15,3)
  4231. IF ~DATATYPE(dnbytes,'W') | dnbytes<1 THEN dnbytes=1
  4232. dbytes=WORD(STATEF(ffile),2)
  4233. IF ~DATATYPE(dbytes,'W') THEN dbytes=1
  4234. IF ~DATATYPE(bps,'W') THEN bps=2400
  4235. needtime=dbytes%(bps%10)+10  /* plus 10 seconds for handshaking? */
  4236. SAY CR
  4237. SAY CR
  4238. CALL showtime()
  4239. SAY 'At least' TRUNC(needtime/60+.05,1) 'minutes needed to download' ffile 'at' bps 'baud.'CR
  4240. SAY 'After this transfer your upload:download ratio will be 1:'TRUNC((dbytes+dnbytes)/upbytes)||CR
  4241. IF level>(sysoplevel+1) | POS('EMAILFILES',UPPER(PRAGMA('D')))>0 THEN RETURN 0
  4242. IF (needtime+TIME('E'))>maxtime THEN
  4243.   DO
  4244.     SAY CR
  4245.     SAY 'Sorry, not enough time left in this session to download' dbytes 'bytes.'CR
  4246.     IF needtime>(WORD(data.11,1)*60) THEN
  4247.       SAY 'Leave email to the sysop to make other arrangements to receive this file.'CR
  4248.     SAY CR
  4249.     RETURN 1
  4250.   END
  4251. IF updownratio>0 & (dnbytes/upbytes)>updownratio THEN
  4252.   DO
  4253.     SAY CR
  4254.     line=pen3'       *** You must upload before you do any more downloading! ***'def
  4255.     SAY line||CR
  4256.     SAY '  Maintain a ratio of at least 1 byte uploaded for each' updownratio 'bytes downloaded.'CR
  4257.     IF bbsprefs.4 THEN RETURN 1
  4258.     SAY pen3'             - This requirement is temporarily suspended. -'def||CR
  4259.     SAY CR
  4260.   END
  4261. RETURN 0
  4262.  
  4263.  
  4264. ext_dload:
  4265. SAY CR
  4266. CALL checkdcd()
  4267. allargs=bbsExtDL.baud(name level TRUNC(maxtime-TIME('E')) linesperpage colorflag extdevs)
  4268. IF allargs='' | TRUNC(maxtime-TIME('E'))<30 THEN RETURN
  4269. CALL dload2()
  4270. RETURN
  4271.  
  4272.  
  4273. dload:
  4274. arg=STRIP(arg data.25)
  4275. data.25=''
  4276. curdir=PRAGMA('D')
  4277. OPTIONS PROMPT 'Filenames and/or numbers: '
  4278. IF arg='' THEN PARSE PULL arg  /* no filename given */
  4279. IF arg='' THEN RETURN 0
  4280. allargs=TRANSLATE(arg,'     ',':/,;|')
  4281. tempargs=SPACE(allargs,1)
  4282. numchk=1
  4283. DO ui=1 TO WORDS(tempargs) WHILE STRIP(allargs)~=''
  4284.   arg=WORD(tempargs,ui)
  4285.   IF ~DATATYPE(arg,'W') THEN numchk=0
  4286.   wloc=WORDINDEX(allargs,FIND(allargs,arg))
  4287.   wi=0
  4288.   temp=findfiles(arg)
  4289.   IF wi=999999 THEN RETURN 0
  4290.   IF temp~=arg THEN
  4291.     DO
  4292.       allargs=DELWORD(allargs,FIND(allargs,arg),1)
  4293.       IF temp~=0 THEN allargs=INSERT(temp' ',allargs,wloc-1)
  4294.     END
  4295. END
  4296. IF numchk=0 THEN
  4297.   IF countcheck(bbspath'Numbers/LastFile' 0)>500 THEN
  4298.     DO
  4299.       SAY LEFT('',20)||CR
  4300.       SAY bak2' BBBBS Tip:'def'  Next time try using fileNUMBERS instead of fileNAMES.'CR
  4301.       SAY '              The BBS is MUCH faster at locating files by number.'CR
  4302.     END
  4303.  
  4304. dload2:
  4305. curdir=PRAGMA('D')
  4306. allargs=STRIP(allargs data.25)
  4307. data.25=''
  4308. IF allargs='' THEN RETURN 0
  4309. sleepy='T'
  4310. DO WHILE sleepy='T'
  4311.   arg=''
  4312.   SAY LEFT('',20)||CR
  4313.   temp=WORD(allargs,1)
  4314.   IF DATATYPE(temp,'W') THEN temp=WORD(files.temp,2)
  4315.   test=''
  4316.   IF LENGTH(temp)>40 THEN
  4317.     DO
  4318.       test=temp
  4319.       temp=''
  4320.     END
  4321.   SAY 'Filename(s)'pen3 LEFT(temp,40) def'Protocol:'pen3 protocol||def||CR
  4322.   IF test~='' THEN SAY '           'pen3 test||def||CR
  4323.   DO di=2 TO WORDS(allargs)
  4324.     temp=WORD(allargs,di)
  4325.     IF DATATYPE(temp,'W') THEN temp=WORD(files.temp,2)
  4326.     SAY '           'pen3 temp||def||CR
  4327.   END
  4328.   pline='['pen3'A'def']uto-Logoff-after-transfer ['pen3'D'def']ownload'
  4329.   pline=pline '['pen3'Q'def']uit ['pen3'T'def']ransfer-protocol (aDqt)'
  4330.   sleepy=getinput(1 1 pline '> ')
  4331.   IF sleepy='Q' THEN RETURN 0
  4332.   IF sleepy='A' THEN sleepy='LOGOFF'
  4333.   IF sleepy='T' THEN CALL chpro()
  4334. END
  4335. DO WHILE allargs~=''
  4336.   errorflag=0
  4337.   extdir=''
  4338.   arg=WORD(allargs,1)
  4339.   allargs=STRIP(DELWORD(allargs,1,1))
  4340.   IF DATATYPE(arg,'W') THEN
  4341.     DO
  4342.       CALL setdir(libpath||WORD(files.arg,1))
  4343.       arg=WORD(files.arg,2)
  4344.     END
  4345.   notename=bbspath'FileNotes/'plaindir'/'arg
  4346.   finfo=''
  4347.   IF ~EXISTS(arg) THEN
  4348.     DO
  4349.       finfo=STATEF(notename)
  4350.       IF WORDS(finfo)>7 THEN
  4351.         DO
  4352.           temp=plaindir
  4353.           x=lastslash(WORD(finfo,8))
  4354.           arg=WORD(x,1)
  4355.           CALL setdir(WORD(x,2))
  4356.           plaindir=temp
  4357.         END
  4358.     END
  4359.   x=lastslash(arg)
  4360.   IF WORDS(x)>1 THEN
  4361.     DO
  4362.       arg=WORD(x,1)
  4363.       extdir=WORD(x,2)
  4364.       CALL setdir(extdir)
  4365.     END
  4366.   DO dloadloop=1
  4367.     IF statuscheck(arg) THEN
  4368.       DO
  4369.         errorflag=1
  4370.         LEAVE dloadloop
  4371.       END
  4372.     CALL postuser(5)
  4373.     CALL sound('DOWNLOAD')
  4374.     SAY 'Starting' protocol 'transfer.  Press' pen3'Esc'def 'to abort.'CR
  4375.     CALL checktime()
  4376.     UpLoad arg
  4377.     IF RC>0 | stats(15) THEN
  4378.       DO
  4379.         errorflag=1
  4380.         LEAVE dloadloop
  4381.       END
  4382.     CALL bytes2user(15 WORD(STATEF(arg),2))
  4383.     IF extdir='' & POS('EMAILFILES',UPPER(PRAGMA('D')))=0 THEN
  4384.       DO dloadloop2=1 TO 1
  4385.         DO di=sysoplevel+2 TO 100
  4386.           IF UPPER(dirs.di)=UPPER(plaindir) THEN LEAVE dloadloop2
  4387.         END
  4388.         IF readlines(notename 1) THEN
  4389.           DO
  4390.             CALL send2log('Unable to increment download count for' plaindir'/'arg)
  4391.             LEAVE dloadloop2
  4392.           END
  4393.         dls=WORD(lynes.2,7)
  4394.         IF ~DATATYPE(dls,'W') THEN dls=0
  4395.         lynes.2=STRIP(DELWORD(lynes.2,7,1)) dls+1
  4396.         finfo=STATEF(notename)
  4397.         IF WORDS(finfo)>7 THEN finfo=SUBSTR(finfo,WORDINDEX(finfo,8))
  4398.         ELSE finfo=''
  4399.         CALL DELETE(notename)
  4400.         CALL savelines(notename)
  4401.         CALL DELAY(28)
  4402.         IF finfo~='' THEN ADDRESS COMMAND 'C:filenote' notename finfo
  4403.         IF WORD(data.16,1)<WORD(lynes.1,2) THEN
  4404.           DO
  4405.             lastbrowse=WORD(lynes.1,2)
  4406.             newfilesdate=DATE('S') TIME()
  4407.           END
  4408.       END
  4409.     LEAVE dloadloop
  4410.   END
  4411. END
  4412. CALL setdir(curdir)
  4413. IF errorflag THEN SAY pen3'*** Download Failed!'def||CR
  4414. IF sleepy='LOGOFF' THEN
  4415.   DO
  4416.     SAY CR
  4417.     SAY 'Logging'pen3 'OFF' def'in 10 seconds...'CR
  4418.     SAY 'Press'pen3 RETURN def'to return to'pen3 bbsname||def||CR
  4419.     SAY CR
  4420.     Timeout 10
  4421.     WAIT '?'
  4422.     t=RC
  4423.     Timeout maxidle
  4424.     IF t~=0 THEN SIGNAL LOGOUT2
  4425.   END
  4426. RETURN errorflag
  4427.  
  4428.  
  4429. lastslash:
  4430. PARSE ARG sarg 
  4431. sdir=''
  4432. slash=LASTPOS('/',sarg)
  4433. IF slash>2 THEN sdir=LEFT(sarg,slash-1)
  4434. ELSE
  4435.   DO
  4436.     slash=LASTPOS(':',sarg)
  4437.     IF slash>0 THEN sdir=LEFT(sarg,slash)
  4438.   END
  4439. IF slash>0 THEN sarg=SUBSTR(sarg,slash+1)
  4440. RETURN sarg sdir
  4441.  
  4442.  
  4443. editnote:
  4444. IF arg='' THEN
  4445.   DO
  4446.     PARSE PULL arg .
  4447.     IF arg='' THEN RETURN 0
  4448.   END
  4449. comment=''
  4450. IF ~EXISTS(arg) THEN
  4451.   DO
  4452.     finfo=STATEF(bbspath'FileNotes/'plaindir'/'arg)
  4453.     temp=''
  4454.     IF WORDS(finfo)>7 THEN comment=WORD(finfo,8)
  4455.     ELSE
  4456.       DO
  4457.         IF level<sysoplevel THEN RETURN 0
  4458.         temp=getinput(1 1 'Is this file on an another device? (Nqy)')
  4459.       END
  4460.     IF temp='Y' THEN
  4461.       DO WHILE comment=''
  4462.         OPTIONS PROMPT 'Enter linkfile using full dev:path/filename > '
  4463.         PARSE PULL comment 
  4464.         comment=STRIP(comment)
  4465.         IF comment='' THEN RETURN 0
  4466.         IF ~EXISTS(comment) THEN comment=''
  4467.       END
  4468.     ELSE IF temp='Q' THEN RETURN 0
  4469.   END
  4470. IF comment='' THEN
  4471.   DO
  4472.     arg=findfiles(arg)
  4473.     IF arg=0 THEN RETURN 0
  4474.     IF DATATYPE(arg,'W') THEN arg=WORD(files.arg,2)
  4475.   END
  4476. filedir=plaindir
  4477. CALL MAKEDIR(bbspath'FileNotes/'filedir)
  4478. IF ~EXISTS(bbspath'FileNotes/'filedir) THEN
  4479.   DO
  4480.     SAY pen3'*** Failed to open directory!' filedir||def||CR
  4481.     RETURN 0
  4482.   END
  4483. notename=bbspath'FileNotes/'filedir'/'arg
  4484. lynes.=''
  4485. filenum=countcheck(bbspath'Numbers/LastFile' 0)
  4486. IF level>sysoplevel THEN firstedit=1
  4487. ELSE firstedit=5
  4488. IF EXISTS(notename) THEN
  4489.   DO
  4490.     IF comment~='' THEN ADDRESS COMMAND 'C:filenote' notename comment
  4491.     CALL bbsED(firstedit notename)
  4492.     RETURN 0
  4493.   END
  4494. IF comment='' THEN filedata=STATEF(libpath||filedir'/'arg)
  4495. ELSE filedata=STATEF(comment)
  4496. IF filedata='' THEN
  4497.   DO
  4498.     IF comment='' THEN line=filedir'/'arg
  4499.     ELSE line=comment
  4500.     SAY line 'does not exist!'CR
  4501.     RETURN 0
  4502.   END
  4503. bytes=WORD(filedata,2)
  4504. filenum=filenum+1
  4505. lynes.0=4
  4506. lynes.1='File: 'LEFT(filenum,5)' KeyWords:'
  4507. lynes.2='Name: 'LEFT(arg,27)' Size: 'bytes' bytes   Downloads: 0'
  4508. lynes.3='From: 'LEFT(name,27)' Date: 'DATE() TIME('C')'  Lib: 'filedir
  4509. lynes.4=LEFT('',74,'=')
  4510. lynes.1=lynes.1 edkeywords(arg filedir)
  4511. CALL seelines(1)
  4512. edtype=''
  4513. CALL writebuffer(scratch'/NoteFile')
  4514. IF savelines(notename) THEN RETURN 0
  4515. IF comment~='' THEN ADDRESS COMMAND 'C:filenote' notename comment
  4516. fncom='R'
  4517. DO WHILE fncom='R'
  4518.   CALL seelines(1)
  4519.   nonstop=0
  4520.   line='['pen3'E'def']dit'
  4521.   IF level>sysoplevel THEN line=line '['pen3'K'def']ill'
  4522.   line=line '['pen3'R'def']ead ['pen3'S'def']ave'
  4523.   IF level>sysoplevel THEN line=line '(ekrS) 'def
  4524.   ELSE line=line '(erS) 'def
  4525.   fncom=getinput(1 1 line)
  4526.   IF fncom='K' & level>sysoplevel THEN
  4527.     DO
  4528.       SAY 'Killing FileNote..'CR
  4529.       CALL DELETE(notename)
  4530.       RETURN 1
  4531.     END
  4532.   ELSE IF fncom='E' THEN
  4533.     DO
  4534.       IF bbsED(firstedit notename)>0 THEN RETURN 0
  4535.       fncom='R'
  4536.     END
  4537.   ELSE IF fncom~='R' THEN
  4538.     DO
  4539.       SAY 'Adjusting filelist...'CR
  4540.       IF filenum<1 THEN filenum=1
  4541.       IF SHOW('P','BBBBS_LOCAL') THEN CALL SETCLIP('BBS_mainfiles',1)
  4542.       CALL countcheck(bbspath'Numbers/LastFile' filenum)
  4543.       files.0=files.0+1
  4544.       newcount=alpha.0+1
  4545.       alpha.0=newcount
  4546.       files.filenum=plaindir arg
  4547.       files.filenum.0=newcount
  4548.       libnum=finddirnum(plaindir)
  4549.       PARSE VAR lynes.1 . 'KeyWords:' keywords
  4550.       alpha.newcount=LEFT(arg,22-LENGTH(WORD(lynes.2,4)))
  4551.       alpha.newcount=alpha.newcount WORD(lynes.2,4) RIGHT(filenum,5)
  4552.       alpha.newcount=alpha.newcount RIGHT(libnum,2) LEFT(plaindir,12)
  4553.       alpha.newcount=alpha.newcount STRIP(LEFT(STRIP(keywords),32))
  4554.       IF EXISTS(bbspath'Lists/Files') THEN
  4555.         x=OPEN(f,bbspath'Lists/Files','A')
  4556.       ELSE x=OPEN(f,bbspath'Lists/Files','W')
  4557.       IF x=0 THEN
  4558.         DO
  4559.           SAY '*** Failed to open' bbspath'Lists/Files'CR
  4560.           RETURN 0
  4561.         END
  4562.       CALL WRITELN(f,filenum files.filenum)
  4563.       CALL CLOSE(f)
  4564.       IF EXISTS(bbspath'Lists/Files.ALPHA') THEN
  4565.         x=OPEN(f,bbspath'Lists/Files.ALPHA','A')
  4566.       ELSE x=OPEN(f,bbspath'Lists/Files.ALPHA','W')
  4567.       IF x=0 THEN
  4568.         DO
  4569.           SAY '*** Failed to open' bbspath'Lists/Files.ALPHA'CR
  4570.           RETURN 0
  4571.         END
  4572.       CALL WRITELN(f,alpha.newcount)
  4573.       CALL CLOSE(f)
  4574.       sortalphaflag=1
  4575.       savefileflag=1
  4576.       CALL cleanline(1)
  4577.     END
  4578. END
  4579. RETURN 0
  4580.  
  4581.  
  4582. edkeywords:
  4583. PARSE ARG kwarg
  4584. templine=''
  4585. DO WHILE LENGTH(templine)<3
  4586.   SAY CR
  4587.   SAY pen3'Please enter a list of keywords (or a condensed description)'def||CR
  4588.   SAY pen3'to be used in the alphabetic list and by the search routine.'def||CR
  4589.   SAY '    Note that only the first 32 characters will be used.'CR
  4590.   SAY LEFT('',43)'|'LEFT('',31,'=')'|'CR
  4591.   templine=getinput(0 0 ' 'RIGHT(STRIP(RIGHT(kwarg,32)),32) pen3'KeyWords: 'def)
  4592.   templine=cleanstring('0:'templine)
  4593.   templine=STRIP(LEFT(templine,32))
  4594. END
  4595. SAY CR
  4596. RETURN templine
  4597.  
  4598.  
  4599. loadfiles:
  4600. SAY def||CR
  4601. SAY 'Loading filelist...'CR
  4602. files.=''
  4603. files.0=0
  4604. IF readopen(bbspath'Lists/Files') THEN
  4605.   DO
  4606.     DO i=1
  4607.       line=READLN(f)
  4608.       IF EOF(f) THEN BREAK
  4609.       num=WORD(line,1)
  4610.       IF DATATYPE(num,'W') THEN files.num=WORD(line,2) WORD(line,3)
  4611.     END
  4612.     files.0=i-1
  4613.     CALL CLOSE(f)
  4614.   END
  4615. RETURN
  4616.  
  4617.  
  4618. savefilelist:
  4619. IF level=99 THEN
  4620.   IF getinput(1 1 'Update filelists now? (nY) > ')='N' THEN RETURN
  4621.  
  4622. savefilelist2:
  4623. SIGNAL OFF BREAK_E
  4624. IF ckmaint('FILES') THEN RETURN
  4625. CALL savealphalist()
  4626. SAY 'Saving filelist...'CR
  4627. CALL SETCLIP('BBS_maint',1)
  4628. xarg=bbspath'Lists/Files'
  4629. CALL DELETE(xarg)
  4630. filenum=countcheck(bbspath'Numbers/LastFile' 0)
  4631. IF filenum<1 | writeopen(xarg)=0 THEN RETURN
  4632. DO i=1 TO filenum
  4633.   IF files.i='' THEN ITERATE i
  4634.   CALL WRITELN(f,i files.i)
  4635. END
  4636. CALL CLOSE(f)
  4637. CALL SETCLIP('BBS_maint')
  4638. savefileflag=0
  4639. IF SHOW('P','BBBBS_LOCAL') THEN CALL SETCLIP('BBS_mainfiles',2)
  4640. RETURN
  4641.  
  4642.  
  4643. loadalpha:
  4644. SAY def||CR
  4645. SAY 'Loading the alphabetical filelist...'CR
  4646. IF readopen(bbspath'Lists/Files.ALPHA') THEN
  4647.   DO
  4648.     alpha.=''
  4649.     alpha.0=0
  4650.     DO i=1
  4651.       line=READLN(f)
  4652.       IF EOF(f) THEN BREAK
  4653.       fnum=WORD(line,3)
  4654.       IF DATATYPE(fnum,'W') THEN
  4655.         DO
  4656.           alpha.i=line
  4657.           files.fnum.0=i
  4658.         END
  4659.       ELSE i=i-1
  4660.     END
  4661.     CALL CLOSE(f)
  4662.     alpha.0=i-1
  4663.     IF alpha.0<files.0 THEN buildalpha=1
  4664.   END
  4665. ELSE SAY pen3'*** Lists/Files.ALPHA failed to open for reading!'def||CR
  4666. SAY CR
  4667. RETURN
  4668.  
  4669.  
  4670. ckmaint:
  4671. ARG ckfile .
  4672. IF GETCLIP('BBS_maint')~='' THEN
  4673.   DO
  4674.     DO i=0 TO 23 WHILE GETCLIP('BBS_maint')~=''
  4675.       IF i//2=0 THEN SAY 'Waiting' (24-i)*5 'more seconds for' ckfile 'list update to finish...'CR
  4676.       CALL DELAY(250)
  4677.     END
  4678.     IF i>23 THEN
  4679.       DO
  4680.         line='*** unable to update' ckfile 'list.'
  4681.         CALL send2log(line DATE() TIME('C'))
  4682.         SAY line||CR
  4683.         RETURN 1
  4684.       END
  4685.   END
  4686. RETURN 0
  4687.  
  4688.  
  4689. savealphalist:
  4690. SIGNAL OFF BREAK_E
  4691. IF ckmaint('ALPHA') THEN RETURN
  4692. CALL SETCLIP('BBS_maint',1)
  4693. IF GETCLIP('BBS_localfiles')~='' THEN
  4694.   DO
  4695.     CALL SETCLIP('BBS_localfiles')
  4696.     CALL loadfiles()
  4697.     CALL loadalpha()
  4698.   END
  4699. aarg=bbspath'Lists/Files.ALPHA'
  4700. CALL DELETE(aarg)
  4701. IF sortalphaflag=1 THEN
  4702.   DO
  4703.     SAY 'Alphabetizing' alpha.0 'files...'CR
  4704.     CALL QSORT(1,alpha.0,alpha)
  4705.     DO i=1 TO alpha.0
  4706.       fnum=WORD(alpha.i,3)
  4707.       files.fnum.0=i
  4708.     END
  4709.   END
  4710. sortalphaflag=0
  4711. IF writeopen(aarg)=0 THEN
  4712.   DO
  4713.     SAY '*** Error opening' aarg '!'CR
  4714.     CALL SETCLIP('BBS_maint')
  4715.     RETURN
  4716.   END
  4717. SAY 'Saving alphabetical filelist...'CR
  4718. DO i=1 TO alpha.0
  4719.   ii=WORD(alpha.i,3)
  4720.   IF files.ii='' THEN alpha.i='0 0' ii '100'
  4721.   IF LEFT(alpha.i,4)~='0 0 ' THEN CALL WRITELN(f,alpha.i)
  4722. END
  4723. CALL CLOSE(f)
  4724. CALL SETCLIP('BBS_maint')
  4725. ADDRESS AREXX bbsALPHA.rexx SUBSTR(extension,2) arccom
  4726. RETURN
  4727.  
  4728.  
  4729. viewuser:
  4730. SAY CR
  4731. SAY bak2' 'name' 'def||CR
  4732. DO i=1 TO 18
  4733.   stuff=data.i
  4734.   IF i=13 | i=14 THEN stuff=DATE(,data.i,'S')
  4735.   SAY RIGHT(i,2)||pen3 text.i||def':' stuff||CR
  4736. END
  4737. CALL waiting()
  4738. RETURN
  4739.  
  4740.  
  4741. edituser:
  4742. IF getinput(1 1 'Change ['pen3'U'def']ser data or ['pen3'M'def']essage conference access (mU) > ')='M' THEN
  4743.   DO
  4744.     SAY CR
  4745.     SAY pen3'     - Message Conference Access -'def||CR
  4746.     SAY '[O]ff turns all message conferences OFF.'CR
  4747.     SAY 'Set the last message read by you in ALL message conferences'CR
  4748.     temp=getinput(1 1 ' ['pen3'L'def']ast  ['pen3'F'def']irst  ['pen3'O'def']ff  ['pen3'Q'def']uit  (fLoq) > ')
  4749.     IF temp='Q' THEN RETURN
  4750.     SAY 'Resetting...'lineup||CR
  4751.     data.22=''
  4752.     DO i=1 TO level
  4753.       IF temp='F' THEN num=0
  4754.       ELSE IF temp='O' THEN num=-1
  4755.       ELSE num=countcheck(bbspath'Numbers/LastMessage'i 0)
  4756.       data.22=data.22 num
  4757.     END
  4758.     CALL SetData()
  4759.     CALL sortconferences()
  4760.     CALL savedata(1)
  4761.     RETURN
  4762.   END
  4763. new=0
  4764. change=0
  4765. edata.=''
  4766. edname=name
  4767. DO i=0 TO data.0
  4768.   edata.i=data.i
  4769. END
  4770. num=1
  4771. DO WHILE num~='' | edname~=name
  4772.   IF num='' | LEFT(num,1)='Q' THEN
  4773.     DO
  4774.       IF change THEN
  4775.         DO
  4776.           CALL SetData()
  4777.           CALL saveData(1)
  4778.           change=0
  4779.         END
  4780.       IF new THEN
  4781.         DO
  4782.           data.=''
  4783.           DO i=0 TO edata.0
  4784.             data.i=edata.i
  4785.           END
  4786.           name=edname
  4787.           new=0
  4788.         END
  4789.       CALL SetData()
  4790.     END
  4791.   maxnum=10
  4792.   IF edata.20>sysoplevel THEN maxnum=20
  4793.   IF edata.20=99 THEN maxnum=27
  4794.   SAY bak2' 'name' 'def||CR
  4795.   maxlines=21
  4796.   IF maxnum=10 THEN maxlines=20
  4797.   DO i=1 TO maxlines
  4798.     IF i=5 & name~=edname & edata.20<99 THEN ITERATE
  4799.     SAY RIGHT(i,2)||pen3 text.i||def':' data.i||CR
  4800.   END
  4801.   IF edata.20>sysoplevel THEN
  4802.     DO
  4803.       line=LEFT(' ',50)
  4804.       IF name=edname THEN line=line'NEW = Change User.'
  4805.       line=pen3||line||def||lineup
  4806.       SAY line||CR
  4807.     END
  4808.   num=getinput(1 0 'Select Line Number To Edit: ')
  4809.   IF num='NEW' & edata.20>sysoplevel & edname=name THEN    /* select a new user */
  4810.     DO
  4811.       new=1
  4812.       IF change THEN
  4813.         DO
  4814.           CALL SetData()
  4815.           CALL saveData(1)
  4816.         END
  4817.       change=0
  4818.       nufile=bbspath'Lists/NEW_USERS'
  4819.       IF EXISTS(nufile) THEN
  4820.         IF ~readlines(nufile 1) THEN CALL seelines(0)
  4821.       savename=name
  4822.       name=getinput(1 0 'New User Name: 'def)
  4823.       name=cleanstring(1':'name)
  4824.       IF loadData()=0 THEN name=savename
  4825.       IF data.20>=edata.20 THEN
  4826.         DO
  4827.           SAY 'Can''t Edit!' pen3||name def'has an equal or higher level than thee.'
  4828.           name=savename
  4829.           CALL loadData()
  4830.         END
  4831.     END
  4832.   ELSE IF DATATYPE(num,'W') & num>0 THEN
  4833.     DO
  4834.       IF num>maxnum THEN
  4835.         DO
  4836.           SAY CR
  4837.           SAY pen3'You are not authorized to change that information!'def||CR
  4838.           SAY CR
  4839.         END
  4840.       ELSE
  4841.         DO dummy=1 TO 1
  4842.           IF num=8 THEN
  4843.             DO
  4844.               SAY CR
  4845.               SAY 'Use spaces to separate options.'CR
  4846.               SAY 'If the option word is in line 8, it is ON.'CR
  4847.               SAY 'Valid Options:'CR
  4848.               SAY '        COLOR  turns ANSI color codes ON.'CR
  4849.               SAY '        MENU   combines all main commands into 1 menu.'CR
  4850.               SAY '        MENUS  splits main commands into 3 menus.'CR
  4851.               SAY '        PHONE  makes your phone number public.'CR
  4852.               SAY '        QUICK  activates offline options. See bbsQUICK.DOC'CR
  4853.               SAY '        STREET makes your street address public.'CR
  4854.               SAY '        TERSE  skips some of the logon procedures.'CR
  4855.               SAY CR
  4856.             END
  4857.           line=RIGHT(num,2)||pen3 text.num||def': '
  4858.           SAY line||data.num||CR
  4859.           temp=getinput(0 0 line)
  4860.           IF temp='' THEN
  4861.             DO
  4862.               IF num=1 | num=4 | num=5 | num=6 | num=7 THEN LEAVE dummy
  4863.               IF num=11 | num=12 | num=13 | num=20 THEN LEAVE dummy
  4864.             END
  4865.           IF num=5 | num=8 THEN temp=UPPER(temp)
  4866.           IF num=20 & DATATYPE(temp,'W') & temp>=edata.20 THEN
  4867.             temp=data.20
  4868.           IF edata.20>sysoplevel & name~=edname THEN line2=name' '
  4869.           ELSE line2=''
  4870.           IF num=21 & name=edname & edata.20<99 THEN LEAVE dummy
  4871.           line=text.num':' data.num pen6'CHANGED TO'def temp
  4872.           CALL send2log(line2||line)
  4873.           data.num=temp
  4874.           SAY line||CR
  4875.           SAY CR
  4876.           change=1
  4877.         END
  4878.     END
  4879. END
  4880. IF change THEN
  4881.   DO
  4882.     CALL SetData()
  4883.     CALL saveData(1)
  4884.   END
  4885. RETURN
  4886.  
  4887.  
  4888. getnumber:
  4889. PARSE ARG tprompt
  4890. tnum=getinput(1 0 '  'tprompt' > ')
  4891. mask=COMPRESS(XRANGE(),'0123456789')
  4892. tnum=COMPRESS(tnum,mask)
  4893. IF ~DATATYPE(tnum,'W') THEN tnum=0
  4894. tnum=tnum%1
  4895. IF tnum>0 & tnum<10 THEN tnum='0'tnum
  4896. RETURN tnum
  4897.  
  4898.  
  4899. getbirth:
  4900. data.12=WORD(data.12,1)'  'WORD(data.12,2)'  Birthday:'
  4901. SAY pen3'Please enter your birthday.'def||CR
  4902. month=getnumber('month: (1-12)')
  4903. day=getnumber('  day: (1-31)')
  4904. year=getnumber(' year:       ')
  4905. IF year<100 THEN year=year+1900
  4906. born=year||month||day
  4907. IF born<18750101 | born>(DATE('S')-50000) THEN   /* must be older than 4 */
  4908.   DO
  4909.     born=''
  4910.     IF getinput(1 1 'Would you rather skip this question? (Ny) > ')~='Y' THEN
  4911.       CALL getbirth()
  4912.   END
  4913. data.12=WORD(data.12,1)'  'WORD(data.12,2)'  'WORD(data.12,3)' 'WORD(born,1)
  4914. RETURN
  4915.  
  4916.  
  4917. getname:
  4918. CALL showuserlist()
  4919. SAY CR
  4920. pline='Please enter your full Email name : '
  4921. name=getinput(1 0 pline)
  4922. IF name='' THEN
  4923.   DO
  4924.     name=getinput(1 0 pline)
  4925.     IF name='' THEN
  4926.       DO
  4927.         SAY 'No name, no entry.  Bye!'CR
  4928.         SIGNAL DONE
  4929.       END
  4930.   END
  4931. name=cleanstring(1':'name)
  4932. IF FIND(userlist,name)>0 | FIND(exclusion,name)>0 THEN
  4933.   DO
  4934.     SAY 'Sorry! That name is taken. Please try again.'CR
  4935.     RETURN 1
  4936.   END
  4937. RETURN 0
  4938.  
  4939.  
  4940. /** see if name is in data */
  4941.  
  4942. checkUser:
  4943. tries=0
  4944. IF name='NEW' THEN
  4945.   DO
  4946.     name=''
  4947.     DO WHILE getname()
  4948.     END
  4949.     CALL postuser(7)
  4950.   END
  4951. IF FIND(userlist,name)=0 THEN
  4952.   DO
  4953.     IF EXISTS(bbspath'BBS_TEXT/NEW') THEN
  4954.       DO
  4955.         nonstop=0
  4956.         CALL readlines(bbspath'BBS_TEXT/NEW' 1)
  4957.         CALL seelines(0)
  4958.         CALL waiting()
  4959.       END
  4960.     SAY CR
  4961.     IF getinput(1 1 'Do you want to register? (nY) > ')='N' THEN
  4962.       DO
  4963.         SAY 'Thanks anyway, bye!'CR
  4964.         line=name 'did not want to register.'
  4965.         SIGNAL OUT2
  4966.       END
  4967.     defile=bbspath'BBS_TEXT/DEF.NEW_USER'
  4968.     CALL loadcourtesy()
  4969.     wordnum=FIND(courtesy,name)
  4970.     IF wordnum>0 THEN
  4971.       DO
  4972.         SAY name', is on the Courtesy List. You will be granted immediate access.'CR
  4973.         courtesy=STRIP(DELWORD(courtesy,wordnum,1))
  4974.         IF writeopen(bbspath'Lists/Courtesy') THEN
  4975.           DO
  4976.             DO i=1 TO WORDS(courtesy)
  4977.               CALL WRITELN(f,WORD(courtesy,i))
  4978.             END
  4979.             CALL CLOSE(f)
  4980.           END
  4981.         defile=bbspath'BBS_TEXT/DEF.COURTESY'
  4982.       END
  4983.     ELSE IF bbsprefs.7=0 THEN SAY name', You have new user access.'CR
  4984.     IF readlines(defile 1) THEN SIGNAL DONE
  4985.     CALL sound('NEW_USER')
  4986.     data.=''
  4987.     data.0=24
  4988.     DO i=6 TO 22
  4989.       data.i=lynes.i
  4990.     END
  4991.     data.12=DATE('S')'  'TIME('C')
  4992.     data.13=data.12
  4993.     lastondate=DATE('I')-1
  4994.     lastontime=TIME('C')
  4995.     x=FIND(UPPER(data.8),'COLOR')
  4996.     test=getinput(1 1 'Does your terminal handle' pen3'ANSI color'def 'codes? (nY) > ')
  4997.     IF test='N' THEN
  4998.       DO
  4999.         IF x>0 THEN data.8=DELWORD(data.8,x,1)
  5000.         CALL colors(0)
  5001.       END
  5002.     ELSE IF x=0 THEN
  5003.       DO
  5004.         data.8=data.8 'COLOR'
  5005.         CALL colors(1)
  5006.       END
  5007.     SAY 'Please enter the password you would like to use here.'CR
  5008.     data.5=getinput(1 0 'Password: ')
  5009.     IF data.5='' THEN
  5010.       DO
  5011.         line=''name 'refused to enter a password.'
  5012.         SIGNAL DONE
  5013.       END
  5014.     data.1=''
  5015.     DO WHILE data.1=''
  5016.       data.1=getinput(0 0 'Full Name: ')
  5017.       IF data.1='' THEN SAY 'You MUST leave your real name!'CR
  5018.     END
  5019.     data.2=getinput(0 0 'Street: ')
  5020.     data.3=getinput(0 0 'City, State Zip: ')
  5021.     data.4=''
  5022.     DO WHILE data.4=''
  5023.       data.4=getinput(0 0 'Phone: ')
  5024.       IF data.4='' THEN
  5025.         SAY sysop 'MUST be able to reach you by phone to validate you!'CR
  5026.     END
  5027.     CALL getbirth()
  5028.     IF bbsprefs.8 THEN
  5029.       DO
  5030.         newufile=bbspath'Lists/NEW_USERS'
  5031.         IF EXISTS(newufile) THEN ok=OPEN(f,newufile,'A')
  5032.         ELSE
  5033.           DO
  5034.             ok=OPEN(f,newufile,'W')
  5035.             IF ok~=0 THEN CALL WRITELN(f,'*** New Users ***')
  5036.           END
  5037.         IF ok~=0 THEN
  5038.           DO
  5039.             temp=RIGHT(TIME('C'),7) COMPRESS(DATE())
  5040.             temp=temp LEFT(name,24)'=' data.1'  'data.4
  5041.             CALL WRITELN(f,temp) 
  5042.           END
  5043.         CALL CLOSE(f)
  5044.       END
  5045.     data.9=getinput(0 0 'Computer: ')
  5046.     data.10=getinput(0 0 'Interests: ')
  5047.     test=getinput(1 1 pen3'Do you want other users to see your STREET address? (Ny) > 'def)
  5048.     IF test='Y' THEN data.8=data.8 'STREET'
  5049.     test=getinput(1 1 pen3'Do you want other users to see your PHONE number? (Ny) > 'def)
  5050.     IF test='Y' THEN data.8=data.8 'PHONE'
  5051.     IF bbsprefs.7>0 THEN
  5052.       DO
  5053.         data.20=bbsprefs.7
  5054.         data.11='60 minutes' bbsprefs.16-1 'more times today'
  5055.       END
  5056.     SAY CR
  5057.     CALL SetData()
  5058.     IF data.20=0 THEN
  5059.       SAY 'Thank you, the sysop will give you higher access soon.'CR
  5060.     ELSE IF bbsprefs.25=1 THEN
  5061.       DO
  5062.         data.22=''
  5063.         data.23=''
  5064.         SAY CR
  5065.         SAY 'Setting message counters to last 10 messages in each conference...'CR
  5066.         DO i=1 TO level
  5067.           num=countcheck(bbspath'Numbers/LastMessage'i 0)-10
  5068.           IF num<0 | msg.i.0<10 THEN num=0
  5069.           lastread.i=num
  5070.           data.22=data.22 num
  5071.           data.23=data.23 0
  5072.         END
  5073.         SAY 'Setting file counter to last file uploaded...'CR
  5074.         lastbrowse=countcheck(bbspath'Numbers/LastFile' 0)
  5075.         newfilesdate='19900101 00:00:00'
  5076.       END
  5077.     SAY CR
  5078.     SAY 'Please feel free to leave additional info by using [C]omment.'CR
  5079.     SAY CR
  5080.     CALL saveData(1)
  5081.     SAY 'Adding' name 'to the user list...'CR
  5082.     newpassword=data.5
  5083.     sortuserflag=1
  5084.     temp=countcheck(bbspath'Numbers/Users' 0)+1
  5085.     CALL countcheck(bbspath'Numbers/Users' temp)
  5086.     CALL DELETE(bbspath'Lists/USERS')
  5087.   END
  5088. ELSE
  5089.   DO
  5090.     IF loadData()=0 THEN SIGNAL DONE
  5091.     PARSE VAR data.11 amins . atimes .
  5092.     lastondate=DATE('I',WORD(data.13,1),'S')
  5093.     lastontime=WORD(data.13,2)
  5094.     IF DATE('I')>lastondate | level>=sysoplevel THEN atimes=bbsprefs.16
  5095.     IF level=99 THEN amins=120
  5096.     data.13=DATE('S')'  'TIME()
  5097.     data.11=amins 'minutes' atimes-1 'more times today'
  5098.     IF atimes<1 & DATE('I')=lastondate THEN
  5099.       DO
  5100.         SAY CR
  5101.         SAY CR
  5102.         line= 'Too many calls today.   Call tomorrow.'
  5103.         SAY line||CR
  5104.         SAY CR
  5105.         SAY CR
  5106.         CALL send2log(line)
  5107.         city=docity(data.3)
  5108.         SIGNAL LOGOUT
  5109.       END
  5110.     data.13=DATE('S')'  'TIME('C')
  5111.     SAY pen3'Password will'def 'NOT' pen3'be echoed.'def||CR
  5112.     SAY CR
  5113.     passprompt='Enter Password: '
  5114.     DO tries=1 TO 3
  5115.       Send passprompt
  5116.       Remote OFF
  5117.       OPTIONS PROMPT ''
  5118.       newpassword=getinput(1 0 '')
  5119.       Remote ON
  5120.       IF(password=newpassword) THEN
  5121.         DO
  5122.           SAY ''CR
  5123.           LEAVE tries; /* correct password */
  5124.         END
  5125.       IF tries=3 THEN
  5126.         DO             /* 3 tries, hang up */
  5127.           SAY ''CR
  5128.           SAY 'Access terminated.'CR
  5129.           line='*** Bad password ***' newpassword '***'
  5130.           SAY line||CR
  5131.           city=line
  5132.           CALL postuser(6)
  5133.           SIGNAL OUT2
  5134.         END
  5135.       SAY ''lineup'                                 'CR
  5136.       passprompt='Incorrect.  Password: ' /* ask again */
  5137.     END
  5138.   END
  5139. SAY CR
  5140. IF bbsprefs.23=1 THEN ADDRESS AREXX bbsSpeak.rexx 'LOGON' name bbspath saypath
  5141. RETURN
  5142.  
  5143.  
  5144. saveData:
  5145. ARG messflag .
  5146. IF data.5='' THEN RETURN
  5147. temp=GETCLIP(name'_UPDATE')
  5148. IF temp~='' THEN
  5149.   DO
  5150.     CALL SETCLIP(name'_UPDATE')
  5151.     PARSE VAR temp upfiles' 'upbytes' 'upmail' 'upmsg
  5152.     IF upfiles>0 THEN
  5153.       DO
  5154.         files=WORD(data.14,1)
  5155.         bytes=WORD(data.14,3)
  5156.         IF DATATYPE(files,'W') THEN upfiles=upfiles+files
  5157.         IF DATATYPE(bytes,'W') THEN bytes=upbytes
  5158.         data.14=upfiles 'files' bytes 'bytes.' DATE()
  5159.       END
  5160.     IF upmail>0 THEN
  5161.       DO
  5162.         mail=WORD(data.17,2)
  5163.         IF DATATYPE(mail,'W') THEN upmail=upmail+mail
  5164.         data.17=WORD(data.17,1) upmail WORD(data.17,3)
  5165.       END
  5166.     IF upmsg~='' THEN
  5167.       DO
  5168.         temp=data.23
  5169.         DO i=1 TO level
  5170.           msg=WORD(temp,i)
  5171.           IF ~DATATYPE(msg,'W') THEN msg=0
  5172.           IF FIND(upmsg,i) THEN msg=msg+1
  5173.           data.23=data.23 msg
  5174.         END
  5175.       END
  5176.   END
  5177. SAY 'Updating...             'lineup||CR
  5178. SIGNAL OFF BREAK_E
  5179. Status Trans
  5180. data.6=STRIP(RESULT)
  5181. IF newfilesdate~='' THEN data.16=lastbrowse newfilesdate
  5182. ELSE IF lastbrowse>0 THEN
  5183.   DO
  5184.     IF WORDS(data.16)>1 THEN data.16=DELWORD(data.16,1,1)
  5185.     ELSE data.16=DATE('S') TIME()
  5186.     data.16=lastbrowse data.16
  5187.   END
  5188. IF messflag THEN
  5189.   DO
  5190.     userexclude.=0
  5191.     DO si=1 TO WORDS(data.22)
  5192.       IF WORD(data.22,si)=-1 THEN userexclude.si=1
  5193.     END
  5194.     data.22=''
  5195.     data.23=''
  5196.     DO si=1 TO level
  5197.       IF ~DATATYPE(lastread.si,'W') THEN lastread.si=0
  5198.       IF userexclude.si THEN data.22=data.22 '-1'
  5199.       ELSE data.22=data.22 lastread.si
  5200.       IF ~DATATYPE(totwrit.si,'W') THEN totwrit.si=0
  5201.       data.23=data.23 totwrit.si
  5202.     END
  5203.   END
  5204. IF writeopen(bbspath'USERS/'name)=0 THEN RETURN
  5205. IF data.0<27 THEN data.0=27
  5206. DO i=1 TO data.0
  5207.   CALL WRITELN(f,data.i)
  5208. END
  5209. CALL CLOSE(f)
  5210. SAY 'User' name 'has been updated.'CR
  5211. RETURN
  5212.  
  5213.  
  5214. loadData:
  5215. IF name='' THEN RETURN 0
  5216. IF ~readopen(bbspath'USERS/'name) THEN RETURN 0
  5217. data.=''
  5218. DO i=1
  5219.   line=READLN(f)
  5220.   IF EOF(f) THEN BREAK
  5221.   data.i=line
  5222. END
  5223. data.0=i-1
  5224. CALL CLOSE(f)
  5225. winnings=WORD(data.18,1)
  5226. IF ~DATATYPE(winnings,'N') THEN winnings=0
  5227.  
  5228. setData:
  5229. IF WORDS(data.16)<3 THEN data.16='0 19900101 00:00:00'
  5230. lastbrowse=WORD(data.16,1)
  5231. IF ~DATATYPE(lastbrowse,'W') THEN lastbrowse=0
  5232. level=data.20
  5233. DO i=1 TO level
  5234.   lastread.i=WORD(data.22,i)
  5235.   IF ~DATATYPE(lastread.i,'W') THEN lastread.i=0
  5236.   totwrit.i=WORD(data.23,i)
  5237.   IF ~DATATYPE(totwrit.i,'W') THEN totwrit.i=0
  5238. END
  5239. password=data.5
  5240. IF data.6='' THEN
  5241.   DO
  5242.     Status Trans
  5243.     data.6=RESULT
  5244.   END
  5245. ELSE
  5246.   DO
  5247.     IF RIGHT(UPPER(data.6),2)='-G' THEN data.6='G'
  5248.     IF RIGHT(UPPER(data.6),3)='-1K' THEN data.6='K'
  5249.     IF LEFT(UPPER(data.6),1)='A' THEN data.6='Z'
  5250.     Set UPPER(LEFT(data.6,1))
  5251.   END
  5252. IF ~DATATYPE(data.7,'W') THEN data.7=20
  5253. IF data.7<5 THEN data.7=5
  5254. linesperpage=data.7
  5255. IF FIND(UPPER(data.8),'TERSE')>0 THEN terseflag=1
  5256. ELSE terseflag=0
  5257. IF FIND(UPPER(data.8),'COLOR')>0 THEN colorflag=1
  5258. ELSE colorflag=0
  5259. CALL colors(colorflag)
  5260. menu='ALL'
  5261. IF FIND(UPPER(data.8),'MENUS')>0 THEN
  5262.   DO
  5263.     menuflag=1
  5264.     menu='MAIN'
  5265.   END
  5266. ELSE IF FIND(UPPER(data.8),'MENU')>0 THEN menuflag=1
  5267. ELSE menuflag=0
  5268. IF level=0 THEN menu='NEW'
  5269. data.21=UPPER(data.21)
  5270. maxtime=WORD(data.11,1)*60
  5271.  
  5272. loadFriends:
  5273. CALL MAKEDIR(bbspath'Friends')
  5274. alias.=''
  5275. alias.0=0
  5276. realname.=''
  5277. CALL CLOSE(f)
  5278. IF OPEN(f,bbspath'Friends/'name,'R')=0 THEN RETURN 1
  5279. DO i=1
  5280.   line=READLN(f)
  5281.   IF EOF(f) THEN LEAVE i
  5282.   alias.i=WORD(line,1)
  5283.   realname.i=WORD(line,2)
  5284. END
  5285. alias.0=i-1
  5286. CALL CLOSE(f)
  5287. RETURN 1
  5288.  
  5289.  
  5290. switchmenuflag:
  5291. IF menuflag=1 THEN
  5292.   DO
  5293.     menuflag=0
  5294.     noff='OFF'
  5295.   END
  5296. ELSE
  5297.   DO
  5298.     menuflag=1
  5299.     noff='ON'
  5300.   END
  5301. SAY 'Menus turned' pen3||noff||def'.'CR
  5302. SAY 'To make a permanent change, add or delete MENU(S) from [Y]our userdata item 8.'CR
  5303. RETURN
  5304.  
  5305.  
  5306. switchcolors:
  5307. IF colorflag=1 THEN
  5308.   DO
  5309.     colorflag=0
  5310.     noff='OFF'
  5311.   END
  5312. ELSE
  5313.   DO
  5314.     colorflag=1
  5315.     noff='ON'
  5316.   END
  5317. CALL colors(colorflag)
  5318. SAY 'Color turned' pen3||noff||def'.'CR
  5319. SAY 'To make a permanent change, add or delete COLOR from [Y]our userdata item 8.'CR
  5320. RETURN
  5321.  
  5322.  
  5323. /* ANSI pen color codes */
  5324. colors:
  5325. ARG onoff
  5326. IF onoff THEN
  5327.   DO
  5328.     lineup='1B'x'M'
  5329.     def='';  /* default */
  5330.     pen0='';  pen1='';  pen2='';  pen3=''
  5331.     pen4='';  pen5='';  pen6='';  pen7=''
  5332.     bak0='';  bak1='';  bak2='';  bak3=''
  5333.     bak4='';  bak5='';  bak6='';  bak7=''
  5334.   END
  5335. ELSE
  5336.   DO
  5337.     pen0=''; pen1=''; pen2=''; pen3=''; pen4=''; pen5=''; pen6=''; pen7=''
  5338.     bak0=''; bak1=''; bak2=''; bak3=''; bak4=''; bak5=''; bak6=''; bak7=''
  5339.     def='';  lineup=''
  5340.   END
  5341. RETURN
  5342.  
  5343.  
  5344. chpro:
  5345. arg=UPPER(LEFT(arg,1))
  5346. IF(arg='') THEN
  5347.   DO
  5348.     SAY CR
  5349.     SAY '['pen3'W'def']- WXModem'CR
  5350.     SAY '['pen3'X'def']- XModem-CRC'CR
  5351.     SAY '['pen3'K'def']- XModem-1K'CR
  5352.     SAY '['pen3'Y'def']- YModem'CR
  5353.     SAY '['pen3'G'def']- YModem-G'CR
  5354.     SAY '['pen3'Z'def']- ZModem'CR
  5355.     SAY CR
  5356.     arg=getinput(1 0 STRIP(protocol) '> ')
  5357.  END
  5358. IF LEFT(UPPER(arg),1)='A' THEN arg='Z'
  5359. Set arg
  5360. Status Transfer
  5361. protocol=STRIP(RESULT)
  5362. SAY protocol||CR
  5363. RETURN
  5364.  
  5365.  
  5366. sortinfofiles:
  5367. infolist=SHOWDIR(bbspath'Information')
  5368. IF infolist='' THEN
  5369.   DO
  5370.     SAY CR
  5371.     SAY pen3'No files are currently in the Information drawer.'def||CR
  5372.     SAY CR
  5373.     RETURN 1
  5374.   END
  5375. IF ~DATATYPE(sortinfo.0,'W') THEN
  5376.   DO
  5377.     info.=''
  5378.     sortinfo.=''
  5379.     info.0=WORDS(infolist)
  5380.     DO i=1 TO info.0
  5381.       info.i=WORD(infolist,i)
  5382.     END
  5383.     SAY 'Sorting..'CR
  5384.     CALL QSORT(1,info.0,info)
  5385.     sortinfo.0=info.0%3
  5386.     IF (info.0//3)>0 THEN sortinfo.0=sortinfo.0+1
  5387.     DO i=1 TO sortinfo.0
  5388.       sortinfo.i=''
  5389.       DO j=0 TO 2
  5390.         k=i+j*sortinfo.0
  5391.         IF k<=info.0 THEN
  5392.           DO
  5393.             sortinfo.i=sortinfo.i RIGHT(k,3)'.' LEFT(info.k,19)
  5394.             infocount=WORD(STATEF(bbspath'Information/'info.k),8)
  5395.             sortinfo.i.0=sortinfo.i.0||RIGHT(infocount,5) LEFT(info.k,19)
  5396.           END
  5397.       END
  5398.     END
  5399.     SAY lineup'         'lineup||CR
  5400.   END
  5401. RETURN 0
  5402.  
  5403.  
  5404. information:
  5405. IF sortinfofiles() THEN RETURN
  5406. CALL sound('INFO')
  5407. SAY pen3'These text files are available for reading online...'def||CR
  5408. num=1
  5409. readcount=-1
  5410. DO infoloop=1
  5411.   IF num=0 THEN
  5412.     DO
  5413.       IF readcount~=-1 THEN
  5414.         DO
  5415.           sortinfo.0=''
  5416.           IF sortinfofiles() THEN RETURN
  5417.         END
  5418.       SAY CENTER('- Number of accesses per file -',75)||CR
  5419.     END
  5420.   SAY pen3||LEFT('-',75,'-')||def||CR
  5421.   DO i=1 TO sortinfo.0
  5422.     IF num=0 THEN SAY sortinfo.i.0||CR
  5423.     ELSE SAY sortinfo.i||CR
  5424.   END
  5425.   CALL checktime()
  5426.   IF num=0 THEN
  5427.     DO
  5428.       CALL waiting()
  5429.       num=1
  5430.       ITERATE infoloop
  5431.     END
  5432.   num=getinput(1 0 pen3'Select Number Of Information File To View. 0=Stats > 'def)
  5433.   IF num=0 THEN ITERATE infoloop
  5434.   IF ~DATATYPE(num,'W') | num<1 | num>info.0 THEN RETURN
  5435.   readcount=STATEF(bbspath'Information/'info.num)
  5436.   readbytes=WORD(readcount,2)
  5437.   SAY '  'info.num 'is' readbytes 'bytes.'CR
  5438.   IF getinput(1 1 '['pen3'R'def']ead or ['pen3'D'def']ownload? (dR) > ')='D' THEN
  5439.     DO
  5440.       allargs=bbspath'Information/'info.num
  5441.       CALL dload2()
  5442.     END
  5443.   ELSE
  5444.     DO
  5445.       SAY 'Loading File...'CR
  5446.       readcount=WORD(readcount,8)
  5447.       IF ~DATATYPE(readcount,'W') THEN readcount=0
  5448.       ADDRESS COMMAND 'C:filenote' bbspath'Information/'info.num readcount+1
  5449.       CALL DELAY(28)
  5450.       CALL readlines(bbspath'Information/'info.num 1)
  5451.       CALL cleanline(0)
  5452.       SAY lineup'    'lynes.0 'lines.'CR
  5453.       SAY CR    
  5454.       CALL seelines(0)
  5455.     END
  5456.   CALL showtime()
  5457.   IF waitchar~='Q' THEN CALL waiting()
  5458.   nonstop=0
  5459. END
  5460. RETURN
  5461.  
  5462.  
  5463. newfiles:
  5464. SAY CR
  5465. test=''
  5466. test=getinput(1 1 'Show one library only? (Ny) > ')
  5467. IF test='Y' THEN
  5468.   IF chdir()>0 THEN RETURN
  5469. SAY 'Searching for new (un-browsed) files since' DATE(,WORD(data.16,2),'S') 'at' WORD(data.16,3)'...'CR
  5470. lastbrowz=WORD(data.16,1)
  5471. lastfileup=countcheck(bbspath'Numbers/LastFile' 0)
  5472.  
  5473. newfiles2:
  5474. IF lastbrowz>=lastfileup THEN
  5475.   DO
  5476.     lastbrowz=0
  5477.     SAY pen3'No new files. Listing backwards by date from last file uploaded...'def||CR
  5478.   END
  5479. ELSE newfilesflag=1
  5480. j=0
  5481. IF test='Y' THEN
  5482.   DO
  5483.     filecount=WORDS(SHOWDIR(bbspath'FileNotes/'plaindir))
  5484.     CALL busywait(4 1)
  5485.   END
  5486. DO ni=lastfileup TO lastbrowz+1 BY -1
  5487.   IF files.ni~='' THEN
  5488.     DO
  5489.       IF test='Y' THEN 
  5490.         DO
  5491.           IF ni>1 THEN CALL busywait(60 ni lastfileup-lastbrowz)
  5492.           IF j>=filecount THEN LEAVE ni
  5493.           IF UPPER(LEFT(WORD(files.ni,1),12))~=UPPER(LEFT(plaindir,12)) THEN
  5494.             ITERATE ni
  5495.         END
  5496.       jj=files.ni.0
  5497.       IF WORD(alpha.jj,4)>level | FIND(data.21,UPPER(WORD(files.ni,1)))>0 THEN
  5498.         ITERATE ni  /* unauthorized */
  5499.       IF test='Y' THEN CALL busywait(4 0)
  5500.       j=j+1
  5501.       IF j=1 THEN CALL fileheader()
  5502.       SAY alpha.jj||CR
  5503.       IF (j+2)//(linesperpage-1)=0 THEN
  5504.         IF waiting2() THEN LEAVE ni
  5505.       IF test='Y' THEN CALL busywait(4 1)
  5506.     END
  5507. END
  5508. IF test='Y' THEN CALL busywait(4 0)
  5509. IF j//linesperpage~=0 THEN CALL waiting()
  5510. IF j=0 & newfilesflag=1 THEN
  5511.   DO
  5512.     lastbrowz=999999
  5513.     newfilesflag=0
  5514.     CALL newfiles2()
  5515.   END
  5516. IF test~='Y' THEN
  5517.   DO
  5518.     CALL newinfo()
  5519.     IF lynes.0>0 THEN CALL waiting()
  5520.   END
  5521. nonstop=0
  5522. RETURN
  5523.  
  5524.  
  5525. newinfo:
  5526. lynes.=''
  5527. lynes.0=0
  5528. dm=DATE(,WORD(data.16,2),'S')
  5529. PARSE VAR dm da' 'mo' 'yr .
  5530. yr=RIGHT(yr,2)
  5531. sincedate=da'-'mo'-'yr
  5532. startline=1
  5533. arg=bbspath'Information'
  5534. IF WORD(STATEF(arg),5)>lastondate THEN
  5535.   DO
  5536.     ADDRESS COMMAND 'C:LIST >ram:dirlist' arg 'NOHEAD DATES SINCE' sincedate
  5537.     IF WORD(STATEF('ram:dirlist'),2)>3 THEN
  5538.       DO
  5539.         lynes.startline=pen1||bak2' New or Updated Information Files. Enter'def pen3'I'def bak2'from the main menu to read 'def
  5540.         CALL readlines('ram:dirlist' startline+1)
  5541.       END
  5542.   END
  5543. arg=bbspath'Profiles'
  5544. IF level>0 & WORD(STATEF(arg),5)>lastondate THEN
  5545.   DO
  5546.     ADDRESS COMMAND 'C:LIST >ram:dirlist' arg 'NOHEAD DATES SINCE' sincedate
  5547.     IF WORD(STATEF('ram:dirlist'),2)>3 THEN
  5548.       DO
  5549.         startline=lynes.0+2
  5550.         lynes.startline=pen1||bak2' New or Updated User Profiles. Enter'def pen3'&'def bak2'from the main menu to read 'def
  5551.         CALL readlines('ram:dirlist' startline+1)
  5552.       END
  5553.   END
  5554. arg=bbspath'rexxDoors/Data/Polls'
  5555. IF level>0 & WORD(STATEF(arg),5)>lastondate THEN
  5556.   DO
  5557.     startline=lynes.0+2
  5558.     lynes.startline=pen1||bak2' Voting Activity. Enter'def pen3'J'def bak2'from the main menu, then select Polling_Place 'def
  5559.     lynes.0=startline
  5560.   END
  5561. IF logonflag=1 THEN nonstop=1
  5562. IF lynes.0>0 THEN CALL seelines(1)
  5563. nonstop=0
  5564. RETURN
  5565.  
  5566.  
  5567. areaselect:
  5568. SAY pen3||LEFT('-',75,'-')||def||CR
  5569. DO i=1 TO msgs.0
  5570.   SAY msgs.i||CR
  5571.   IF i//linesperpage=0 THEN CALL waiting()
  5572. END
  5573. temp=getinput(1 0 pen3'Select Message Conference: 'def)
  5574. IF ~DATATYPE(temp,'W') | temp<1 | temp>level | FIND(data.21,temp)>0 THEN RETURN 1
  5575. msgdir=temp
  5576. RETURN 0
  5577.  
  5578.  
  5579. chdir:
  5580. string=''
  5581. SAY pen3||LEFT('-',75,'-')||def||CR
  5582. DO i=1 TO libs.0
  5583.   SAY libs.i||CR
  5584. END
  5585. dirnum=getinput(1 0 pen3'Select Library Number: 'def)
  5586. IF ~DATATYPE(dirnum,'W') THEN
  5587.   DO
  5588.     waitchar=dirnum
  5589.     RETURN 2
  5590.   END
  5591.  
  5592. chdir2:
  5593. IF dirnum<1 | dirnum>99 THEN
  5594.   DO
  5595.     waitchar=dirnum
  5596.     RETURN 1
  5597.   END
  5598. IF dirs.dirnum='' THEN
  5599.   DO
  5600.     SAY pen3'That library number is currently un-assigned.'def||CR
  5601.     RETURN 1
  5602.   END
  5603. IF dirnum>level | FIND(data.21,UPPER(dirs.dirnum))>0 THEN
  5604.   DO
  5605.     SAY pen3'You do not have authorization for that library!'def||CR
  5606.     RETURN 1
  5607.   END
  5608. CALL MAKEDIR(libpath||dirs.dirnum)
  5609. CALL setdir(libpath||dirs.dirnum)
  5610. t=libpath||plaindir'.txt'
  5611. IF ~EXISTS(t) THEN RETURN 0
  5612. nonstop=1
  5613. SAY CR
  5614. CALL readlines(t 1)
  5615. CALL seelines(1)
  5616. SAY CR
  5617. nonstop=0
  5618. RETURN 0
  5619.  
  5620.  
  5621. since:
  5622. dm=DATE(,WORD(data.16,2),'S')
  5623. SAY CR
  5624. SAY 'New files or files moved since' dm||CR
  5625. CALL listsince()
  5626. CALL readlines('RAM:dirlist' 1)
  5627. CALL seelines(1)
  5628. nonstop=0
  5629. CALL waiting()
  5630. RETURN
  5631.  
  5632.  
  5633. listsince:
  5634. dm=DATE(,WORD(data.16,2),'S')
  5635. PARSE VAR dm da' 'mo' 'yr .
  5636. yr=RIGHT(yr,2)
  5637. sincedate=da'-'mo'-'yr
  5638. ADDRESS COMMAND 'C:list >RAM:dirlist' directory 'DATES SINCE' sincedate
  5639. RETURN
  5640.  
  5641.  
  5642. list:
  5643. onetime=0
  5644. IF DATATYPE(arg,'W') THEN onetime=1
  5645. ELSE arg=''
  5646. DO listloop=1
  5647.   IF DATATYPE(arg,'W') THEN
  5648.     DO
  5649.       dirnum=arg
  5650.       arg=''
  5651.       IF chdir2()>0 THEN RETURN
  5652.       CALL listsimple()
  5653.       IF waitchar='Q' | onetime THEN LEAVE listloop
  5654.     END
  5655.   ELSE IF arg='' THEN
  5656.     DO
  5657.       IF chdir()>0 THEN RETURN
  5658.       test='Y'
  5659.       CALL showalpha2()
  5660.       arg=''
  5661.       IF waitchar='Q' THEN waitchar=''
  5662.       IF waitchar~='' THEN RETURN
  5663.       ITERATE listloop
  5664.     END
  5665.   ELSE RETURN
  5666. END
  5667. RETURN
  5668.  
  5669.  
  5670. listsimple:
  5671. ADDRESS COMMAND 'C:list >RAM:dirlist' directory 'DATES'
  5672. IF readlines('RAM:dirlist' 1) THEN RETURN
  5673. IF lynes.0>3 THEN
  5674.   DO
  5675.     SAY pen3'Sorting...'def||lineup||CR
  5676.     linesave=lynes.1  /* these 4 lines put in to leave dir title at top */
  5677.     lynes.1='0'
  5678.     CALL QSORT(1,lynes.0-1,lynes)
  5679.     CALL DELAY(14)
  5680.     lynes.1=linesave
  5681.   END
  5682. CALL seelines(1)
  5683. nonstop=0
  5684. CALL waiting()
  5685. RETURN
  5686.  
  5687.  
  5688. browse:
  5689. curdironly=0
  5690. brdir=PRAGMA('D')
  5691. brfilenum=1
  5692. nonstop=0
  5693. IF files.0<1 THEN RETURN
  5694. lastfilenum=countcheck(bbspath'Numbers/LastFile' 0)
  5695. IF lastfilenum<1 THEN RETURN
  5696. onearg=0
  5697. IF arg='' THEN
  5698.   DO
  5699.     lin='Browsing'
  5700.     test=getinput(1 1 'Browse one library only? (Ny) > ')
  5701.     IF test='Y' THEN
  5702.       DO
  5703.         IF chdir()>0 THEN RETURN
  5704.         curdironly=1
  5705.         lin=lin 'the' pen3||plaindir||def 'library'
  5706.         t=libpath||plaindir'.txt'
  5707.         IF level>sysoplevel THEN
  5708.           IF getinput(1 1 'Edit the'pen3 Plaindir def'library info file? (Ny) > ')='Y' THEN
  5709.             DO
  5710.               IF ~EXISTS(t) THEN
  5711.                 DO
  5712.                   IF writeopen(t)~=0 THEN
  5713.                     DO
  5714.                       CALL WRITELN(f,TRIM(CENTER('***' plaindir '***',77)))
  5715.                       CALL WRITELN(f,LEFT('',75,'='))
  5716.                       CALL CLOSE(f)
  5717.                       CALL DELAY(28)
  5718.                     END
  5719.                 END
  5720.               CALL bbsED(1 t)
  5721.               RETURN
  5722.             END
  5723.       END
  5724.     ELSE lin=lin 'all file libraries'
  5725.     lin=lin 'backwards from latest file.'
  5726.     SAY lin||CR
  5727.     SAY CR
  5728.   END
  5729. ELSE onearg=1
  5730. i=0
  5731. IF arg='' | UPPER(arg)='NEW' | UPPER(arg)='ALL' THEN
  5732.   DO lastfileloop=1
  5733.     IF lastfilenum<1 THEN RETURN
  5734.     arg=WORD(files.lastfilenum,2)
  5735.     brfilenum=lastfilenum
  5736.     IF WORD(files.lastfilenum,2)~='' THEN LEAVE lastfileloop
  5737.     lastfilenum=lastfilenum-1
  5738.   END
  5739. ELSE IF DATATYPE(arg,'W') & files.arg~='' THEN
  5740.   DO
  5741.     brfilenum=arg
  5742.     arg=WORD(files.arg,2)
  5743.     IF arg='' THEN
  5744.       DO
  5745.         SAY 'File number' brfilenum 'does not exist in the current libraries!'CR
  5746.         RETURN
  5747.       END
  5748.   END
  5749. ELSE
  5750.   DO
  5751.     IF onearg THEN CALL busywait(4 1)
  5752.     DO ni=lastfilenum TO 1 BY -1
  5753.       IF onearg THEN CALL busywait(60 ni lastfilenum)
  5754.       IF UPPER(WORD(files.ni,2))~=UPPER(arg) THEN ITERATE ni
  5755.       brfilenum=ni
  5756.       CALL busywait(4 0)
  5757.       LEAVE ni
  5758.     END
  5759.     IF ni<1 THEN
  5760.       DO
  5761.         SAY 'Unable to find a file description for' pen3||arg||def'.'CR
  5762.         RETURN
  5763.       END
  5764.   END
  5765. IF ~curdironly THEN CALL setdir(libpath||WORD(files.brfilenum,1))
  5766. savearg=arg
  5767. IF brfilenum>lastfilenum THEN brfilenum=lastfilenum
  5768. newfilesdate=DATE('S') TIME()
  5769. DO browseloop=1
  5770.   IF curdironly THEN CALL busywait(4 1)
  5771.   DO ni=brfilenum TO 0 BY -1
  5772.     IF ni=0 THEN LEAVE browseloop
  5773.     IF files.ni='' THEN ITERATE ni
  5774.     IF onearg THEN
  5775.       DO
  5776.         CALL busywait(60 ni lastfilenum)
  5777.         IF UPPER(arg)=UPPER(WORD(files.ni,2)) THEN LEAVE ni
  5778.         ELSE ITERATE ni
  5779.       END
  5780.     testdir=UPPER(WORD(files.ni,1))
  5781.     IF curdironly & UPPER(plaindir)~=UPPER(testdir) THEN
  5782.       DO
  5783.         IF ni>lastbrowse THEN lastbrowse=ni
  5784.         IF ni>0 THEN CALL busywait(60 ni lastfilenum)
  5785.         ITERATE ni
  5786.       END
  5787.     IF FIND(data.21,testdir)>0 | finddirnum(testdir)>level THEN
  5788.       DO
  5789.         IF ni>lastbrowse THEN lastbrowse=ni
  5790.         ITERATE ni
  5791.       END
  5792.     LEAVE ni
  5793.   END
  5794.   IF curdironly | onearg THEN CALL busywait(4 0)
  5795.   onearg=0
  5796.   IF ni=0 THEN brfilenum=lastbrowse
  5797.   ELSE brfilenum=ni
  5798.   argname=WORD(files.brfilenum,2)
  5799.   IF argname='' THEN RETURN
  5800.   CALL setdir(libpath||WORD(files.brfilenum,1))
  5801.   arg=bbspath'FileNotes/'plaindir'/'argname
  5802.   CALL readlines(arg 1)
  5803.   IF nonstop=1 THEN brostop=1
  5804.   ELSE brostop=0
  5805.   CALL seelines(1)
  5806.   IF brfilenum>lastbrowse THEN lastbrowse=brfilenum
  5807.   CALL checktime()
  5808.   IF brostop THEN
  5809.     DO
  5810.       SAY CR
  5811.       nonstop=1
  5812.       brfilenum=brfilenum-1
  5813.     END
  5814.   ELSE
  5815.     DO
  5816.       line=''
  5817.       endtest=UPPER(RIGHT(argname,4))
  5818.       IF FIND('.ARC .ARJ .DMS .LZH .LHA .RUN .ZIP .ZOO',endtest)>0 THEN
  5819.         line='['pen3'C'def']ontents ['pen3'D'def']ownload'
  5820.       ELSE line='['pen3'D'def']ownload'
  5821.       IF level>sysoplevel | name=WORD(lynes.3,2) THEN
  5822.         line=line '['pen3'E'def']dit'
  5823.       IF level>sysoplevel | name=WORD(lynes.3,2) THEN
  5824.         line=line '['pen3'K'def']ill'
  5825.       IF level>sysoplevel THEN line=line '['pen3'L'def']ib'
  5826.       line=line '['pen3'M'def']ark ['pen3'N'def']on-Stop'
  5827.       IF endtest='.TXT' THEN line=line '['pen3'R'def']ead'
  5828.       line=line '['pen3'Q'def']uit ['pen3'?'def'] > '
  5829.       brcom=getinput(1 0 line)
  5830.       IF DATATYPE(brcom,'W') THEN
  5831.         DO
  5832.           brfilenum=brcom+1
  5833.           IF brfilenum>lastfilenum THEN brfilenum=lastfilenum+1
  5834.           IF brfilenum<1 THEN brfilenum=1
  5835.           SAY CR
  5836.         END
  5837.       ELSE brcom=LEFT(brcom,1)
  5838.       CALL cleanline(0)
  5839.       IF brcom='Q' THEN LEAVE browseloop
  5840.       IF brcom='M' THEN
  5841.         DO
  5842.           wordnum=FIND(data.25,brfilenum)
  5843.           IF wordnum=0 THEN
  5844.             DO
  5845.               data.25=STRIP(data.25 brfilenum)
  5846.               SAY lineup||argname 'marked for next download.'CR
  5847.               SAY CR
  5848.             END
  5849.           ELSE
  5850.             DO
  5851.               data.25=STRIP(DELWORD(data.25,wordnum,1))
  5852.               SAY argname 'removed from download list.'CR
  5853.             END
  5854.         END
  5855.       IF brcom='H' | brcom='?' THEN
  5856.         DO
  5857.           SAY pen3' - HELP with the Browse Files commands -'def||CR
  5858.           SAY ' RETURN reads the next file description in line.'CR
  5859.           SAY ' 34 will display the description of file number 34, if it exists.'CR
  5860.           SAY ' C  displays the contents of an archived (arc dms lzh lha zip zoo) file.'CR
  5861.           SAY ' D  displays the download menu.'CR
  5862.           IF level>sysoplevel | name=WORD(lynes.3,2) THEN
  5863.             DO
  5864.           SAY ' E  puts this file description into the online Editor.'CR
  5865.           SAY ' K  deletes a file you uploaded. you cannot Kill others!'CR
  5866.             END
  5867.           IF level>sysoplevel THEN
  5868.           SAY ' L  move file and description to new Library and/or rename.'CR
  5869.           SAY ' M  mark/unmark the current file for the next download'CR
  5870.           SAY ' N  displays all descriptions without pausing. CTRL-E to Exit!'CR
  5871.           SAY ' R  displays file as text. - ONLY FILES THAT END IN .TXT -'CR
  5872.           SAY ' Q  returns to the main menu(s). (Quit)'CR
  5873.           SAY CR
  5874.           CALL waiting()
  5875.           IF waitchar='Q' THEN LEAVE browseloop
  5876.         END
  5877.       ELSE IF brcom='L' & level>sysoplevel THEN
  5878.         DO
  5879.           curdir=PRAGMA('D')
  5880.           IF getinput(1 1 'Rename' argname '? (Ny) > ')='Y' THEN
  5881.             DO
  5882.               newarg=getinput(0 0 'Rename' argname 'to ')
  5883.               IF newarg~='' THEN
  5884.                 DO
  5885.                   IF is_here(newarg) THEN ITERATE browseloop
  5886.                   IF wi=999999 THEN ITERATE browseloop
  5887.                   IF EXISTS(libpath||filedir'/'newarg) THEN
  5888.                     DO
  5889.                       SAY CR
  5890.                       SAY '***' newarg 'already exists!'CR
  5891.                       SAY CR
  5892.                       ITERATE browseloop
  5893.                     END
  5894.                   junk=getinput(1 1 'Are you SURE you want to rename' argname 'to' newarg'? (Ny) ')
  5895.                   IF junk='Y' THEN
  5896.                     DO
  5897.                       lynes.2=OVERLAY(newarg,lynes.2,7,25)
  5898.                       comment=WORD(STATEF(arg),8)
  5899.                       CALL DELETE(arg)
  5900.                       arg=bbspath'FileNotes/'plaindir'/'newarg
  5901.                       CALL savelines(arg)
  5902.                       IF comment='' THEN
  5903.                         DO
  5904.                           mpath=libpath||plaindir
  5905.                           IF RENAME(mpath'/'argname,mpath'/'newarg)=0 THEN
  5906.                             SAY 'Rename failed on main file!'CR
  5907.                         END
  5908.                       ELSE
  5909.                         DO
  5910.                           t=LASTPOS('/',comment)
  5911.                           IF t=0 THEN t=LASTPOS(':',comment)
  5912.                           mpath=LEFT(comment,t-1)
  5913.                           IF RENAME(comment,mpath'/'newarg)=1 THEN
  5914.                             ADDRESS COMMAND 'C:FileNote' arg mpath'/'newarg
  5915.                           ELSE SAY 'Rename failed on external file!'CR
  5916.                         END
  5917.                       files.brfilenum=STRIP(WORD(files.brfilenum,1)) newarg
  5918.                       anum=files.brfilenum.0
  5919.                       alpha.anum=OVERLAY(newarg,alpha.anum,1,WORDINDEX(alpha.anum,2)-2)
  5920.                       CALL send2log('RENAME:' argname 'to' newarg 'in' plaindir)
  5921.                       argname=newarg
  5922.                       sortalphaflag=1
  5923.                       savefileflag=1
  5924.                     END
  5925.                 END
  5926.             END
  5927.           mvdir=getinput(0 0 'Move' argname 'to Library (name|number) ')
  5928.           IF mvdir~='' THEN
  5929.             DO
  5930.               IF DATATYPE(mvdir,'W') THEN
  5931.                 DO
  5932.                   dirnum=mvdir
  5933.                   IF UPPER(dirs.dirnum)~=UPPER(WORD(files.brfilenum,1)) THEN
  5934.                     DO
  5935.                       IF chdir2()=0 THEN
  5936.                         DO
  5937.                           CALL readlines(arg 1)
  5938.                           CALL movefile(brfilenum dirs.dirnum)
  5939.                         END
  5940.                     END
  5941.                 END
  5942.               ELSE
  5943.                 DO
  5944.                   mvdir=STRIP(mvdir)
  5945.                   IF UPPER(mvdir)~=UPPER(WORD(files.brfilenum,1)) THEN
  5946.                     DO
  5947.                       DO mj=1 TO level+1
  5948.                         IF UPPER(mvdir)=UPPER(dirs.mj) THEN LEAVE mj
  5949.                       END
  5950.                       IF mj<=level THEN CALL movefile(brfilenum mvdir)
  5951.                     END
  5952.                 END
  5953.             END
  5954.           IF savefileflag>0 THEN CALL savefilelist()
  5955.           CALL setdir(curdir)
  5956.         END
  5957.       ELSE IF brcom='N' THEN
  5958.         DO
  5959.           brfilenum=brfilenum-1
  5960.           nonstop=1
  5961.           SAY pen3'To EXIT non-stop scrolling of text, press CTRL-E'def||CR
  5962.           SAY CR
  5963.           CALL DELAY(100)
  5964.           brcom=''
  5965.         END
  5966.       ELSE IF brcom='C' THEN
  5967.         DO
  5968.           temp=STRIP(WORD(STATEF(arg),8))
  5969.           IF temp='' THEN temp=libpath||plaindir'/'argname
  5970.           CALL Contents.rexx(temp)
  5971.           IF EXISTS('RAM:CONTENTS') THEN
  5972.             DO
  5973.               CALL cleanline(1)
  5974.               CALL readlines('RAM:CONTENTS' 1)
  5975.               CALL seelines(0)
  5976.               IF waitchar~='Q' THEN CALL waiting()
  5977.               nonstop=0
  5978.             END
  5979.           ELSE SAY pen3'Not an archived file.'def||CR
  5980.         END
  5981.       ELSE IF brcom='D' THEN
  5982.         DO
  5983.           arg2=arg
  5984.           arg=brfilenum
  5985.           CALL dload()
  5986.           arg=arg2
  5987.         END
  5988.       ELSE IF brcom='E' THEN
  5989.         DO
  5990.           IF level>sysoplevel | name=WORD(lynes.3,2) THEN
  5991.             DO
  5992.               firstedit=5
  5993.               IF level>sysoplevel THEN firstedit=1
  5994.               CALL bbsED(firstedit arg)
  5995.             END
  5996.         END
  5997.       ELSE IF brcom='K' THEN
  5998.         DO
  5999.           IF level>sysoplevel | name=WORD(lynes.3,2) THEN
  6000.             DO
  6001.               IF getinput(1 1 pen3'Do you really want to kill this file? (nY) >'def)~='N' THEN
  6002.                 DO
  6003.                   tempnum=WORD(lynes.1,2)
  6004.                   IF tempnum=lastfilenum THEN
  6005.                     DO
  6006.                       CALL DELETE(bbspath'Numbers/LastFile')
  6007.                       CALL DELAY(28)
  6008.                       lastfilenum=lastfilenum-1
  6009.                       CALL countcheck(bbspath'Numbers/LastFile' lastfilenum)
  6010.                     END
  6011.                   files.tempnum=''
  6012.                   tempnum2=files.tempnum.0
  6013.                   alpha.tempnum2='0 0' tempnum '100'
  6014.                   IF SHOW('P','BBBBS_LOCAL') THEN CALL savefilelist()
  6015.                   ELSE savefileflag=1
  6016.                   finfo=STATEF(arg)
  6017.                   IF WORDS(finfo)>7 THEN argname=WORD(finfo,8)
  6018.                   CALL DELETE(argname)
  6019.                   CALL DELETE(arg)
  6020.                   CALL send2log('Killed:' argname)
  6021.                   SAY argname pen3'has been deleted.'def||CR
  6022.                 END
  6023.             END
  6024.         END
  6025.       ELSE IF brcom='R' & endtest='.TXT' THEN
  6026.         DO
  6027.           vcount=WORD(lynes.2,7)+1
  6028.           lynes.2=STRIP(DELWORD(lynes.2,7,1)) vcount
  6029.           edtype=''
  6030.           CALL savelines(arg)
  6031.           CALL showtext(argname)
  6032.         END
  6033.       ELSE brfilenum=brfilenum-1
  6034.     END
  6035. END
  6036. CALL setdir(brdir)
  6037. waitchar=''
  6038. IF nonstop THEN CALL waiting()
  6039. nonstop=0
  6040. CALL savedata(0)
  6041. RETURN
  6042.  
  6043.  
  6044. movefile:
  6045. PARSE ARG fnum movdir .
  6046. fromdir=STRIP(WORD(files.fnum,1))
  6047. farg=STRIP(WORD(files.fnum,2))
  6048. CALL MAKEDIR(libpath||movdir)
  6049. ADDRESS COMMAND 'C:COPY' libpath||fromdir'/'farg libpath||movdir
  6050. IF EXISTS(libpath||movdir'/'farg) THEN CALL DELETE(libpath||fromdir'/'farg)
  6051. files.fnum=movdir farg
  6052. lynes.3=DELWORD(lynes.3,WORDS(lynes.3),1)
  6053. lynes.3=STRIP(lynes.3) movdir
  6054. CALL MAKEDIR(bbspath'FileNotes/'movdir)
  6055. CALL savelines(bbspath'FileNotes/'movdir'/'farg)
  6056. ndx=files.fnum.0
  6057. dnum=finddirnum(movdir)
  6058. alpha.ndx=OVERLAY(RIGHT(dnum,2) movdir,alpha.ndx,31,15)
  6059. IF EXISTS(bbspath'FileNotes/'movdir'/'farg) THEN
  6060.   DO
  6061.     temp=bbspath'FileNotes/'fromdir'/'farg
  6062.     comment=WORD(STATEF(temp),8)
  6063.     CALL DELETE(temp)
  6064.     IF comment~='' THEN
  6065.       ADDRESS COMMAND 'C:FileNote' bbspath'FileNotes/'movdir'/'farg comment
  6066.   END
  6067. savefileflag=1
  6068. line='Moved:' fromdir'/'farg 'to' movdir
  6069. CALL send2log(line)
  6070. SAY line||CR
  6071. RETURN
  6072.  
  6073.  
  6074. textsearch:
  6075. PARSE ARG sfile' 'sarg
  6076. IF sarg='' THEN RETURN 0
  6077. x=OPEN(f,sfile,'R')
  6078. IF x=0 THEN RETURN 0
  6079. sarg=UPPER(sarg)
  6080. stemp=UPPER(READCH(f,65000))
  6081. CALL CLOSE(f)
  6082. retflag=0
  6083. IF POS(sarg,stemp)>0 THEN retflag=1
  6084. DROP stemp
  6085. RETURN retflag
  6086.  
  6087.  
  6088. bbsSEARCH:
  6089. smenu=menu
  6090. test=UPPER(LEFT(arg,1))
  6091. IF test='F' THEN smenu='FILE'
  6092. IF test='M' THEN smenu='MSG'
  6093. IF test='U' THEN smenu='MAIN'
  6094. IF smenu='ALL' THEN
  6095.   DO
  6096.     junk=getinput(1 1 'Search ['pen3'F'def']iles ['pen3'M'def']essages or ['pen3'U'def']sers (fmu) > ')
  6097.     IF junk='F' THEN smenu='FILE'
  6098.     ELSE IF junk='M' THEN smenu='MSG'
  6099.     ELSE IF junk='U' THEN smenu='MAIN'
  6100.     ELSE RETURN
  6101.   END
  6102. IF WORDS(arg)>1 THEN searcharg=UPPER(SUBSTR(arg,WORDINDEX(arg,2)))
  6103. ELSE searcharg=getinput(0 0 pen3'Search Phrase: 'def)
  6104. IF LENGTH(STRIP(searcharg))=0 THEN RETURN
  6105. searcharg=COMPRESS(searcharg,'*')
  6106. CALL send2log('SEARCH:' smenu 'for' searcharg)
  6107. IF smenu='NEW' | smenu='MAIN' THEN
  6108.   DO
  6109.     SAY 'Searching Userlist...'CR
  6110.     DO i=1 TO WORDS(userlist)
  6111.       IF POS(UPPER(searcharg),UPPER(WORD(userlist,i)))>0 THEN
  6112.         SAY WORD(userlist,i)||CR
  6113.     END
  6114.   END
  6115. IF smenu='MSG' THEN
  6116.   DO
  6117.     IF getinput(1 1 'Search one conference only? (Ny) > ')='Y' THEN
  6118.       DO
  6119.         IF areaselect() THEN RETURN
  6120.         SAY 'Searching' msg.msgdir 'Message Conference for'pen3 searcharg||def'...'CR
  6121.         SAY CR
  6122.         CALL searchmsgdir()
  6123.       END
  6124.     ELSE
  6125.       DO
  6126.         SAY 'Searching All Public Message Conferences for'pen3 searcharg||def'...'CR
  6127.         SAY CR
  6128.         DO i=1 TO level
  6129.           msgdir=i
  6130.           IF msg.msgdir='' | FIND(data.21,msgdir)>0 THEN ITERATE i
  6131.           CALL searchmsgdir()
  6132.           i=msgdir
  6133.           IF msgcom='Q' THEN i=999999
  6134.         END
  6135.       END
  6136.   END
  6137. IF smenu='FILE' THEN
  6138.   DO
  6139.     line=pen3'Searching'
  6140.     curdironly=0
  6141.     IF getinput(1 1 'Search one library only? (Ny) > ')='Y' THEN
  6142.       DO
  6143.         IF chdir()>0 THEN RETURN
  6144.         curdironly=1
  6145.         line=line 'the' pen3||plaindir||def 'library'
  6146.         SAY CR
  6147.       END
  6148.     ELSE
  6149.       DO
  6150.         line=line 'all file libraries'
  6151.         SAY CR
  6152.         SAY pen3'WARNING!'def 'Searching' RIGHT(files.0,5) '['pen3'F'def']ull descriptions may take'pen3 TRUNC(files.0/(114*cpu)+.05,1) def'minutes!'CR
  6153.       END
  6154.     test=getinput(1 1 '   ['pen3'A'def']lphaList search or ['pen3'F'def']ull descriptions? (Afq) > ')
  6155.     IF test='Q' THEN RETURN
  6156.     SAY CR
  6157.     SAY line 'for'def UPPER(searcharg)||CR
  6158.     SAY pen3' - To ABORT, press CTRL-E -'def||CR
  6159.     SAY CR
  6160.     IF test~='F' THEN
  6161.       DO
  6162.         CALL fileheader()
  6163.         DO i=1 TO alpha.0
  6164.           CALL busywait(60 i alpha.0)
  6165.           ii=WORD(alpha.i,4)
  6166.           IF ii>level THEN ITERATE i
  6167.           IF curdironly=1 & ii~=dirnum THEN ITERATE i
  6168.           ii=WORD(alpha.i,3)
  6169.           IF POS(UPPER(WORD(files.ii,1)),data.21)>0 THEN ITERATE i
  6170.           tempnum=POS(UPPER(searcharg),UPPER(alpha.i))
  6171.           IF tempnum>0 THEN
  6172.             DO
  6173.               CALL busywait(4 0)
  6174.               SAY alpha.i||CR
  6175.               IF colorflag=1 THEN
  6176.                 SAY pen3||LEFT(' ',tempnum-1)||lineup||UPPER(searcharg)||def||CR
  6177.               CALL busywait(4 1)
  6178.             END
  6179.         END
  6180.       END
  6181.     ELSE
  6182.       DO
  6183.         cck=countcheck(bbspath'Numbers/LastFile' 0)
  6184.         nonstop=1
  6185.         DO i=1 TO cck
  6186.           iii=cck+1-i
  6187.           IF files.iii='' THEN ITERATE i
  6188.           ii=files.iii.0
  6189.           ii=WORD(alpha.ii,4)
  6190.           IF ii>level THEN ITERATE i
  6191.           IF curdironly=1 & ii~=dirnum THEN ITERATE i
  6192.           IF POS(UPPER(WORD(files.iii,1)),data.21)>0 THEN ITERATE i
  6193.           farg=WORD(files.iii,1)'/'WORD(files.iii,2)
  6194.           SAY '1B'x'M' RIGHT(farg,40) LEFT(iii,7)||CR
  6195.           IF textsearch(bbspath'FileNotes/'farg searcharg) THEN
  6196.             DO
  6197.               savei=i
  6198.               CALL readlines(bbspath'FileNotes/'farg 1)
  6199.               CALL seelines(2)
  6200.               i=savei
  6201.               SAY CR
  6202.               SAY CR
  6203.             END
  6204.         END
  6205.       END
  6206.     CALL busywait(4 0)
  6207.   END
  6208. searcharg=''
  6209. nonstop=0
  6210. SAY CR
  6211. IF i<999999 THEN SAY 'All available items have been searched.'CR
  6212. SAY CR
  6213. CALL waiting()
  6214. RETURN
  6215.  
  6216.  
  6217. searchmsgdir:
  6218. msglist=SHOWDIR(msgpath||msgdir)
  6219. IF WORDS(msglist)>0 THEN SAY lineup||RIGHT(msg.msgdir,40)||CR
  6220. qi=WORDS(msglist)
  6221. DO wi=1 TO qi
  6222.   CALL busywait(8 wi qi)
  6223.   messnum=WORD(msglist,wi)%1
  6224.   IF textsearch(msgpath||msgdir'/'messnum searcharg) THEN
  6225.     DO
  6226.       CALL busywait(4 0)
  6227.       savelast=lastread.msgdir
  6228.       CALL readmsg(0 messnum)
  6229.       lastread.msgdir=savelast
  6230.       IF msgcom='Q' THEN RETURN
  6231.       CALL busywait(4 1)
  6232.     END
  6233. END
  6234. CALL busywait(4 0)
  6235. RETURN
  6236.  
  6237.  
  6238. finddirnum:
  6239. ARG fdirname .
  6240. DO fdir=1 TO 99
  6241.   IF UPPER(dirs.fdir)=UPPER(fdirname) THEN RETURN fdir
  6242. END
  6243. RETURN 100
  6244.  
  6245.  
  6246. writebuffer:
  6247. PARSE ARG bufname .
  6248. Capture OFF
  6249. CALL DELETE(bufname)
  6250. SAY 'Type 'pen3'/E'def' or 'pen3'/S'def' on a new line to Exit and Save.'CR
  6251. IF EXISTS(bufname) THEN
  6252.   DO
  6253.     CALL DELAY(56)
  6254.     CALL DELETE(bufname)
  6255.     CALL DELAY(56)
  6256.   END
  6257. CaptWrap 74
  6258. Send pen3
  6259. Capture bufname
  6260. Send def
  6261. TimeOut 120
  6262. DO bufloop=1
  6263.   Wait '/E,/S,RING,NO CARRIER'
  6264.   Status 'L'
  6265.   test=LEFT(UPPER(cleanstring(0':'RESULT)),2)
  6266.   CALL checkdcd()
  6267.   IF test='/E' | test='/S' THEN LEAVE bufloop
  6268. END
  6269. Send '\b\b'pen3
  6270. Capture OFF
  6271. CALL checkdcd()
  6272. TimeOut maxidle
  6273. SAY def||CR
  6274. startnum=lynes.0+1
  6275. CALL readlines(bufname startnum)
  6276. CALL wrapbuf(startnum)
  6277. QUEUE CR
  6278. RETURN
  6279.  
  6280.  
  6281. wrapbuf:
  6282. ARG startnum .
  6283. CALL cleanline(1)
  6284. SAY pen3'Wordwrapping...'def||CR
  6285. lynes.startnum=TRANSLATE(lynes.startnum,' ','09'x)
  6286. lynes.startnum=cleanstring(2':'lynes.startnum)
  6287. DO wi=startnum WHILE wi<=lynes.0
  6288.   wj=wi+1
  6289.   lynes.wj=TRANSLATE(lynes.wj,' ','09'x)
  6290.   lynes.wj=cleanstring(2':'lynes.wj)
  6291.   IF LENGTH(lynes.wi)>75 THEN
  6292.     DO
  6293.       testchar=''
  6294.       IF lynes.wj~='' THEN testchar=LEFT(lynes.wj,1)
  6295.       IF testchar=' ' | testchar='.' | testchar=':' THEN
  6296.         DO
  6297.           DO wjj=lynes.0 TO wi+1 BY -1
  6298.             wk=wjj+1
  6299.             lynes.wk=lynes.wjj
  6300.           END
  6301.           lynes.wj=''
  6302.           lynes.0=lynes.0+1
  6303.         END
  6304.       DO wl=WORDS(lynes.wi) TO 1 BY -1 WHILE LENGTH(lynes.wi)>74
  6305.         IF WORDS(lynes.wi)=1 THEN
  6306.           lynes.wi=LEFT(lynes.wi,74) SUBSTR(lynes.wi,75)
  6307.         lynes.wj=WORD(lynes.wi,wl) lynes.wj
  6308.         lynes.wi=STRIP(DELWORD(lynes.wi,wl,1))
  6309.       END
  6310.     END
  6311. END
  6312. RETURN
  6313.  
  6314.  
  6315. seelines:
  6316. ARG fancy .
  6317. DO i=1 TO lynes.0
  6318.   IF fancy=0 THEN SAY lynes.i||def||CR
  6319.   ELSE
  6320.     DO
  6321.       IF LEFT(lynes.i,2)=': ' & WORDS(lynes.i)=2 THEN ITERATE i
  6322.       ELSE IF LEFT(lynes.i,10)='Directory ' | LEFT(lynes.i,5)='=====' THEN
  6323.         SAY pen3||lynes.i||def||CR
  6324.       ELSE SAY lynes.i||CR
  6325.       IF fancy=2 & colorflag=1 & searcharg~='' THEN
  6326.         DO
  6327.           testpos=POS(UPPER(searcharg),UPPER(lynes.i))
  6328.           IF testpos>0 THEN
  6329.             SAY LEFT(' ',testpos-1)||pen3||lineup||UPPER(searcharg)||def||CR
  6330.         END
  6331.     END
  6332.   IF i//linesperpage=0 THEN
  6333.     IF waiting2() THEN LEAVE i
  6334. END
  6335. nonstop=0
  6336. RETURN
  6337.  
  6338.  
  6339. readlines:
  6340. CALL CLOSE(f)
  6341. PARSE ARG tempname readstart .
  6342. IF ~readopen(tempname) THEN RETURN 1
  6343. IF readstart<2 THEN lynes.=''
  6344. DO ri=readstart
  6345.   line=READLN(f)
  6346.   IF EOF(f) THEN BREAK
  6347.   lynes.ri=line
  6348. END
  6349. lynes.0=ri-1
  6350. CALL CLOSE(f)
  6351. DO ri=lynes.0 TO 0 BY -1 WHILE LENGTH(lynes.ri)=0 | LEFT(UPPER(lynes.ri),2)='/E' | LEFT(UPPER(lynes.ri),2)='/S'
  6352. END
  6353. lynes.0=ri
  6354. RETURN 0
  6355.  
  6356.  
  6357. savelines:
  6358. PARSE ARG tempname .
  6359. IF EXISTS(tempname) & edtype='MAIL' THEN
  6360.   DO
  6361.     ok=OPEN(f,tempname,'A')
  6362.     IF ok~=0 THEN CALL WRITELN(f,LEFT('',74,'^'))
  6363.   END
  6364. ELSE ok=OPEN(f,tempname,'W')
  6365. IF ok=0 THEN
  6366.   DO
  6367.     line='***' tempname 'failed to open for saving!'
  6368.     CALL send2log(line)
  6369.     SAY line||CR
  6370.     RETURN 1
  6371.   END
  6372. DO wi=1 TO lynes.0
  6373.   CALL WRITELN(f,lynes.wi)
  6374. END
  6375. CALL CLOSE(f)
  6376. RETURN 0
  6377.  
  6378.  
  6379. loaduserlist:
  6380. userlist=SHOWDIR(bbspath'Users')
  6381. ulynes.=''
  6382. IF ~EXISTS(bbspath'Lists/USERS') THEN CALL sortuserlist()
  6383. ELSE IF readopen(bbspath'Lists/USERS') THEN
  6384.   DO
  6385.     SAY 'Loading Userlist...'CR
  6386.     DO lui=1
  6387.       line=READLN(f)
  6388.       IF EOF(f) THEN BREAK
  6389.       ulynes.lui=line
  6390.     END
  6391.     ulynes.0=lui-1
  6392.     CALL CLOSE(f)
  6393.   END
  6394. RETURN
  6395.  
  6396.  
  6397. saveuserlist:
  6398. SIGNAL OFF BREAK_E
  6399. IF writeopen(bbspath'Lists/USERS') THEN
  6400.   DO
  6401.     DO i=1 TO ulynes.0
  6402.       CALL WRITELN(f,ulynes.i)
  6403.     END
  6404.     CALL CLOSE(f)
  6405.   END
  6406. RETURN
  6407.  
  6408.  
  6409. sortuserlist:
  6410. SAY 'Rebuilding Userlist...'CR
  6411. sortuserflag=0
  6412. userlist=SHOWDIR(bbspath'Users')
  6413. user.=''
  6414. users=WORDS(userlist)
  6415. user.0=users
  6416. DO uli=1 TO users
  6417.   user.uli=WORD(userlist,uli)
  6418.   uscore=LASTPOS('_',user.uli)
  6419.   IF uscore>0 THEN user.uli=SUBSTR(user.uli,uscore+1)'@'LEFT(user.uli,uscore-1)
  6420. END
  6421. CALL QSORT(1,users,user)
  6422. DO uli=1 TO users
  6423.   uscore=POS('@',user.uli)
  6424.   IF uscore>0 THEN user.uli=SUBSTR(user.uli,uscore+1)'_'LEFT(user.uli,uscore-1)
  6425. END
  6426. ulynes.=''
  6427. ulynes.0=user.0%3
  6428. IF (user.0//3)>0 THEN ulynes.0=ulynes.0+1
  6429. DO i=1 TO ulynes.0
  6430.   ulynes.i=LEFT(user.i,25)
  6431.   DO j=1 TO 2
  6432.     k=i+j*ulynes.0
  6433.     IF k<=users THEN ulynes.i=ulynes.i' 'LEFT(user.k,25)
  6434.   END
  6435. END
  6436. CALL saveuserlist()
  6437. RETURN
  6438.  
  6439.  
  6440. showuserlist:
  6441. IF data.5='' THEN line='Here are the EMail names of your fellow users.'
  6442. ELSE line='   'WORDS(userlist) 'users. Use these names to address messages.'
  6443. SAY pen3||line||def||CR
  6444. DO uli=1 TO ulynes.0
  6445.   SAY ulynes.uli||CR
  6446.   IF uli//linesperpage=0 & uli<ulynes.0 THEN
  6447.     IF waiting2()=1 THEN RETURN
  6448. END
  6449. IF data.5~='' THEN CALL waiting()
  6450. RETURN
  6451.  
  6452.  
  6453. msgcount:
  6454. ARG countdir .
  6455. lastmess=0
  6456. totmsgs=0
  6457. unred=0
  6458. IF ~EXISTS(msgpath||countdir) THEN RETURN
  6459. IF STATEF(msgpath||countdir)=msg.countdir.1 THEN totmsgs=msg.countdir.0
  6460. ELSE
  6461.   DO
  6462.     totmsgs=WORDS(SHOWDIR(msgpath||countdir))
  6463.     msg.countdir.0=totmsgs
  6464.     msg.countdir.1=STATEF(msgpath||countdir)
  6465.   END
  6466. IF countdir>level | FIND(data.21,i)>0 THEN RETURN
  6467. lastread.countdir=WORD(data.22,countdir)
  6468. IF ~DATATYPE(lastread.countdir,'W') THEN lastread.countdir=0
  6469. lastmess=countcheck(bbspath'Numbers/LastMessage'countdir 0)
  6470. IF lastread.countdir<0 THEN RETURN
  6471. firstmess=countcheck(bbspath'Numbers/FirstMessage'countdir 0)
  6472. IF lastread.countdir<firstmess THEN lastread.countdir=firstmess-1
  6473. IF lastmess>0 THEN
  6474.   IF lastread.countdir>=0 THEN
  6475.     DO
  6476.       IF lastread.countdir<(firstmess-1) THEN lastread.countdir=firstmess-1
  6477.       unred=lastmess-lastread.countdir
  6478.       IF unred>totmsgs THEN unred=totmsgs
  6479.       cline=RIGHT(unred,6) 'unread of' RIGHT(lastmess,6)
  6480.       cline=cline 'messages in the 'CENTER(msg.countdir,20)' conference.'
  6481.       IF unred>0 | ~logonflag THEN SAY pen6||cline||def||CR
  6482.     END
  6483. RETURN
  6484.  
  6485.  
  6486. counts:
  6487. SAY CR
  6488. SAY 'Working...'CR
  6489. SAY CR
  6490. temp=''
  6491. DO i=1 TO 4
  6492.   temp=temp||CENTER(copyright.i,75)||'0D0A'x
  6493. END
  6494. CALL SETCLIP('BBS_copyright',temp||CR)
  6495. CALL bbsSTATS.rexx(name colorflag 0 emailonline grand grand2 files.0 WORDS(userlist))
  6496. SAY CR
  6497. CALL waiting2()
  6498. IF waitchar='Q' THEN RETURN
  6499. CALL showmarked(1)
  6500. CALL logonstats()
  6501. nonstop=0
  6502. CALL waiting()
  6503. RETURN
  6504.  
  6505.  
  6506. countmail:
  6507. SAY '   Counting online email...'lineup||CR
  6508. emailonline=0
  6509. DO ti=1 TO WORDS(userlist)
  6510.   emailonline=emailonline+WORDS(SHOWDIR(bbspath'Email/'WORD(userlist,ti)))
  6511. END
  6512. SAY lineup'       'emailonline' letters online.'CR
  6513. RETURN
  6514.  
  6515.  
  6516. hourly:
  6517. IF level=99 & nonstop~=1 THEN
  6518.   DO
  6519.     IF getinput(1 1 'Zero The Hourly Averages? (Ny) > ')='Y' THEN
  6520.       ADDRESS COMMAND 'C:Delete >*' bbspath'Numbers/Hourly/#?'
  6521.     CALL cleanline(1)
  6522.   END
  6523. CALL ShowHourly.rexx(name linesperpage colorflag nonstop)
  6524. RETURN
  6525.  
  6526.  
  6527. logonstats:
  6528. IF level=0 THEN RETURN
  6529. SAY bak2||name||def 'Last on' DATE('W',lastondate,'I') DATE(,lastondate,'I') lastontime||CR
  6530. tempnum=countcheck(bbspath'Numbers/LastFile' 0)-lastbrowse
  6531. IF tempnum>files.0 THEN tempnum=files.0
  6532. line='of' RIGHT(countcheck(bbspath'Numbers/LastFile' 0),6) 'public files uploaded.'CR
  6533. IF tempnum>0 THEN SAY RIGHT(tempnum,6) '   new of' RIGHT(files.0,6) 'files online    'line
  6534. ELSE SAY '       No new' line
  6535. totmsg=0
  6536. grand=0
  6537. grand2=0
  6538. DO i=1 TO 99
  6539.   IF msg.i='' THEN ITERATE i
  6540.   CALL msgcount(i)
  6541.   totmsg=totmsg+unred
  6542.   grand=grand+totmsgs
  6543.   grand2=grand2+lastmess
  6544. END
  6545. line=RIGHT(grand2,6) 'public messages written'
  6546. IF totmsg>0 THEN
  6547.   SAY RIGHT(totmsg,6) '   new of' line',' grand 'messages still online.'CR
  6548. ELSE SAY '       No new of' line'.'CR
  6549.  
  6550. callsleft:
  6551. test=WORD(data.11,3)
  6552. IF test<1 THEN
  6553.   DO
  6554.     IF DATE('S')=WORD(data.13,1) THEN
  6555.       DO
  6556.         line=pen0||bak1' Attention! 'def 'This is your last call for'
  6557.         line=line DATE('W')',' DATE()
  6558.       END
  6559.     ELSE line='It''s after midnight here, you may call' bbsprefs.16 'more times today.'
  6560.   END
  6561. ELSE
  6562.   DO
  6563.     line='You may call' test 'more time'
  6564.     IF test~=1 THEN line=line's'
  6565.     line=line 'today.'
  6566.   END
  6567. SAY line||CR
  6568. RETURN
  6569.  
  6570.  
  6571. checkdcd:
  6572. IF GETCLIP('BBS_interpret')='' THEN
  6573.   DO
  6574.     dcd
  6575.     IF RC=0 THEN
  6576.       DO
  6577.         DO dcds=1 TO 3  /* 5 second delay */
  6578.           CALL DELAY(50)
  6579.           dcd
  6580.           IF RC~=0 THEN RETURN
  6581.         END
  6582.         dcd
  6583.         IF RC=0 THEN
  6584.           DO
  6585.             SAY CR
  6586.             Capture OFF
  6587.             Remote OFF
  6588.             CALL SETCLIP('BBS_disconnect',TIME('C') DATE() name)
  6589.             line='^^^^^ LOST CARRIER! ^^^' DATE() TIME() '^^^^^'
  6590.             SAY line||CR
  6591.             Send '\dATH1\r'
  6592.             CALL send2log(line)
  6593.             CALL sound('LOST')
  6594.             IF newpassword='' THEN SIGNAL DONE
  6595.             ELSE SIGNAL OUT
  6596.           END
  6597.       END
  6598.   END
  6599. CALL checkexternal()
  6600. RETURN
  6601.  
  6602.  
  6603. sound:
  6604. ARG snd 
  6605. IF bbsprefs.13=1 THEN RETURN
  6606. ADDRESS AREXX bbsSounds.rexx bbspath'Sounds/' snd 
  6607. RETURN
  6608.  
  6609.  
  6610. checkexternal:
  6611. xmsg=GETCLIP('BBS_MESSAGE')
  6612. Capture
  6613. IF RC=0 & xmsg~='' THEN
  6614.   DO
  6615.     SAY CR
  6616.     SAY bak2' Message From BBBBS: 'def||CR
  6617.     SAY xmsg||CR
  6618.     SAY CR
  6619.     CALL SETCLIP('BBS_MESSAGE')
  6620.   END
  6621. xstring=GETCLIP('BBS_interpret')
  6622. IF xstring~='' THEN
  6623.   DO
  6624.     CALL SETCLIP('BBS_interpret')
  6625.     INTERPRET xstring
  6626.   END
  6627. xcom=GETCLIP('BBS_COMMAND')
  6628. IF xcom~='' THEN
  6629.   DO
  6630.     CALL SETCLIP('BBS_COMMAND')
  6631.     IF POS('G',xcom)>0 THEN SIGNAL LOGOUT2
  6632.     IF opt~='' THEN
  6633.       DO
  6634.         IF POS('B',xcom)>0 THEN test='/E'
  6635.         IF POS('L',xcom)>0 THEN CALL uplevel()
  6636.         IF POS('M',xcom)>0 THEN CALL validate('DEF.MEMBER')
  6637.         IF POS('R',xcom)>0 THEN CALL upratio()
  6638.         IF POS('T',xcom)>0 THEN CALL uptime()
  6639.         IF POS('V',xcom)>0 THEN CALL validate('DEF.CBV')
  6640.       END
  6641.     IF POS('C',xcom)>0 THEN CALL chat()
  6642.   END
  6643. RETURN
  6644.  
  6645.  
  6646. chat:
  6647. chatrequest=0
  6648. chattime=TIME('E')
  6649. SAY 'Entering chat mode with sysop.'CR
  6650. MSG pen3'- Press backslash [\] to exit -'def
  6651. SAY 'Press [RETURN] twice to tell' sysop 'you are finished typing.'CR
  6652. SAY CR
  6653. OPTIONS PROMPT ''
  6654. string=''
  6655. DO WHILE(string~='\')
  6656.   PULL string
  6657.   CALL checkdcd()
  6658. END
  6659. maxtime=maxtime+(TIME('E')-chattime)%1
  6660. RETURN
  6661.  
  6662.  
  6663. readopen:
  6664. PARSE ARG fname
  6665. ok=OPEN(f,fname,'R')
  6666. IF ok~=0 THEN RETURN 1
  6667. line=fname 'failed to open for reading!'
  6668. SAY line||CR
  6669. CALL send2log(line)
  6670. RETURN 0
  6671.  
  6672.  
  6673. writeopen:
  6674. PARSE ARG fname
  6675. CALL CLOSE(f)
  6676. ok=OPEN(f,fname,'W')
  6677. IF ok~=0 THEN RETURN 1
  6678. line=fname 'failed to open for writing!'
  6679. SAY line||CR
  6680. CALL send2log(line)
  6681. RETURN 0
  6682.  
  6683.  
  6684. set_grand:
  6685. SAY 'Setting up public message conferences...'CR
  6686. grand=0
  6687. DO i=1 TO 99
  6688.   IF msg.i='' THEN ITERATE i
  6689.   msg.i.0=WORDS(SHOWDIR(msgpath||i,'F'))
  6690.   msg.i.1=STATEF(msgpath||i)
  6691.   grand=grand+msg.i.0
  6692. END
  6693. RETURN
  6694.  
  6695.  
  6696. checkstats:          /* clip is set and cleared by stats programs */
  6697. IF TIME('H')>3 & GETCLIP('BBS_STAT')='' THEN
  6698.   DO
  6699.     IF EXISTS(bbspath'Information/STATS.ULDL') THEN
  6700.       DO
  6701.         lfinfo=STATEF(bbspath'Information/STATS.ULDL')
  6702.         IF WORD(lfinfo,5)<DATE('I') THEN
  6703.           DO
  6704.             ADDRESS AREXX bbsULDL.rexx
  6705.             CALL DELAY(100)
  6706.           END
  6707.       END
  6708.     IF TIME('H')>4 & GETCLIP('BBS_STAT')='' & EXISTS(bbspath'Information/STATS.USER') THEN
  6709.       DO
  6710.         ufinfo=STATEF(bbspath'Information/STATS.USER')
  6711.         IF WORD(ufinfo,5)<DATE('I') THEN
  6712.           DO
  6713.             ADDRESS AREXX bbsUSER.rexx
  6714.             CALL DELAY(100)
  6715.           END
  6716.       END
  6717.     IF grand>SYSTEM_MSG_LIMIT & TIME('H')>5 & TIME('H')<9 & GETCLIP('BBS_STAT')='' THEN
  6718.       DO
  6719.         SAY 'Doing Message Conference Maintenence...'CR
  6720.         Send 'ATH1\r'
  6721.         CALL bbsMAINT.baud(SYSTEM_MSG_LIMIT sysop)
  6722.         CALL set_grand()
  6723.         Send 'ATZ\r'
  6724.       END
  6725.   END
  6726. RETURN
  6727.  
  6728.  
  6729. zerovars:
  6730. lastread.=0
  6731. totwrit.=0
  6732. data.=''
  6733. libs.=''
  6734. smsg.=''
  6735. msgs.=''
  6736. sdirs.=''
  6737. pasted.=''
  6738. pasted.0=0
  6739. clear_marked=0
  6740. sortalphaflag=0
  6741. savefileflag=0
  6742. sortuserflag=0
  6743. linesperpage=22
  6744. chatrequest=0
  6745. lastbrowse=0
  6746. buildalpha=0
  6747. terseflag=0
  6748. warnings=0
  6749. winnings=0
  6750. menuflag=0
  6751. nonstop=0
  6752. dirnum=1
  6753. msgdir=1
  6754. level=0
  6755. newfilesflag=0
  6756. newfilesdate=''
  6757. newpassword=''
  6758. replymsg=''
  6759. waitchar=''
  6760. string=''
  6761. name=''
  6762. city='?'
  6763. opt=''
  6764. RETURN
  6765.  
  6766.  
  6767. SYNTAX:
  6768. FAILURE:
  6769. lin.1=pen7||ERRORTEXT(RC)||def
  6770. lin.2=SIGL-1     SOURCELINE(SIGL-1)
  6771. lin.3=SIGL pen7||SOURCELINE(SIGL)||def
  6772. lin.4=SIGL+1     SOURCELINE(SIGL+1)
  6773. DO er=1 TO 4
  6774.   IF level>sysoplevel THEN SAY lin.er||CR
  6775.   CALL send2log(lin.er)
  6776. END
  6777. CALL CLOSE(f)
  6778. IF newpassword='' THEN SIGNAL DONE  /* no user logged on, quit quietly */
  6779. SAY CR
  6780. CALL checkdcd()
  6781. waitchar=''
  6782. IF data.1~='' & data.5~='' & data.20~='' THEN CALL savedata(0)
  6783. SIGNAL RESTART
  6784.  
  6785.  
  6786. BREAK_E:
  6787. CALL CLOSE(f)
  6788. SAY pen3'*** CTRL-E BREAK ***'def||CR
  6789. waitchar=''
  6790. string=''
  6791. nonstop=0
  6792. rnonstop=0
  6793. brostop=0
  6794. i=999999
  6795. wi=999999
  6796. ui=999999
  6797. ni=-1
  6798. QUEUE CR
  6799. RETURN 0
  6800.  
  6801.  
  6802. HALT:
  6803. BREAK_C:
  6804. SIGNAL OFF BREAK_C
  6805. SIGNAL OFF BREAK_E
  6806. CALL CLOSE(f)
  6807. IF newpassword='' THEN
  6808.   DO
  6809.     CALL SETCLIP('BBS_disconnect',TIME('C') DATE() name)
  6810.     SIGNAL DONE  /* no user logged on, quit quietly */
  6811.   END
  6812. CALL checkdcd()
  6813. SAY CR
  6814. IF warnings<1 THEN  /* just 1 warning */
  6815.   DO
  6816.     warnings=warnings+1
  6817.     SAY CR
  6818.     SAY CR
  6819.     SAY CR
  6820.     SAY 'If you didn''t press CTRL-C then...   HEY!    Wake up!'CR
  6821.     SAY '                                     Auto-disconnect in' TRUNC(maxidle/60+.5) 'minutes!'CR
  6822.     SAY CR
  6823.     SAY 'If you DID press CTRL-C,  PLEASE  use CTRL-E next time instead.'CR
  6824.     SAY CR
  6825.     Remote OFF
  6826.     Send '^G\w^G\w^G^G^G^G'
  6827.     Remote ON
  6828.     waitchar=''
  6829.     string=''
  6830.     nonstop=0
  6831.     CALL SETCLIP('BBS_door')
  6832.     SIGNAL ON BREAK_C
  6833.     CALL waiting()
  6834.     SIGNAL RESTART
  6835.   END
  6836. CALL SETCLIP('BBS_disconnect',TIME('C') DATE() name)
  6837. SAY 'No Activity For' TRUNC(maxidle/30+.5) 'minutes! -- Disconnecting.'CR
  6838. Send '\d'
  6839. CALL sound('TIMEOUT')
  6840. SIGNAL OUT
  6841.  
  6842. LOGOUT:
  6843. junk=getinput(1 1 pen3'Leave Feedback for SysOp? (Ny) > 'def)
  6844. IF junk='Y' THEN
  6845.   DO
  6846.     opt='C'  /* to trigger Feedback as Subject */
  6847.     CALL editor('MAIL' sysop)
  6848.   END
  6849.  
  6850. LOGOUT2:
  6851. CALL checkexternal()
  6852. SIGNAL OFF BREAK_E
  6853. CALL SETCLIP('BBS_level')
  6854. CALL callsleft()
  6855. secs=TIME('E')
  6856. mins=secs%60
  6857. secs=TRUNC(secs//60)
  6858. IF secs<10 THEN secs='0'secs
  6859. SAY
  6860. SAY 'Public  files   online: 'RIGHT(comma(files.0),9)||CR
  6861. SAY 'Public messages online: 'RIGHT(comma(grand),9)||CR
  6862. SAY CR
  6863. SAY 'Time used this call:' mins':'secs||CR
  6864. SAY 'Goodbye' name', thank you for calling' bbsname'.'CR
  6865. linesperpage=99
  6866. arg=bbspath'BBS_TEXT/GOODBYE'
  6867. IF EXISTS(arg) THEN
  6868.   DO
  6869.     CALL DELAY(14)
  6870.     CALL readlines(arg 1)
  6871.     CALL seelines(0)
  6872.   END
  6873. SAY CR
  6874. IF bbsprefs.2 & ~terseflag THEN CALL doGrin()
  6875.  
  6876. OUT:
  6877. SIGNAL OFF BREAK_E
  6878. Remote OFF
  6879. CALL sound('LOGOFF')
  6880. data.18=winnings
  6881. line=left(name,16,' ') 'logged off at' time('C')
  6882. dcd
  6883. IF RC~=0 THEN Send '\ah'
  6884. IF data.20~='' THEN
  6885.   DO
  6886.     Status 'Y'
  6887.     elapsed=RESULT
  6888.     line=line 'Total:'elapsed
  6889.     PARSE VAR elapsed thour':'tmin':'.
  6890.     ADDRESS AREXX bbsHOURLY.rexx TIME('H') TIME('M')//60 thour tmin bbspath'Numbers/Hourly'
  6891.     PARSE VAR data.19 dhour 'hours' dmin 'minutes in' calls .
  6892.     IF ~DATATYPE(tmin,'W')  THEN tmin=0
  6893.     IF ~DATATYPE(thour,'W') THEN thour=0
  6894.     IF ~DATATYPE(dhour,'W') THEN dhour=0
  6895.     IF ~DATATYPE(dmin,'W')  THEN dmin=0
  6896.     IF ~DATATYPE(calls,'W') THEN calls=0
  6897.     IF thour=0 & tmin<3 THEN  /* free call if less than 3 minutes */
  6898.       DO
  6899.         wordloc=WORDINDEX(data.11,3)-1
  6900.         wordval=WORD(data.11,3)+1
  6901.         data.11=DELWORD(data.11,3,1)
  6902.         data.11=INSERT(wordval' ',data.11,wordloc)
  6903.       END
  6904.     ufile=LEFT(DATE('S'),6)
  6905.     mmins=thour*60+tmin+countcheck(bbspath'Usage/'ufile 0)
  6906.     CALL countcheck(bbspath'Usage/'ufile mmins)
  6907.     mins=thour*60+tmin+countcheck(bbspath'Numbers/Minutes' 0)
  6908.     CALL countcheck(bbspath'Numbers/Minutes' mins)
  6909.     mins=thour*60+tmin+countcheck(bbspath'Numbers/Minutes'bps 0)
  6910.     CALL countcheck(bbspath'Numbers/Minutes'bps mins)
  6911.     cals=countcheck(bbspath'Numbers/Calls' 0)+1
  6912.     CALL countcheck(bbspath'Numbers/Calls' cals)
  6913.     cals=countcheck(bbspath'Numbers/Calls'bps 0)+1
  6914.     CALL countcheck(bbspath'Numbers/Calls'bps cals)
  6915.     thour=thour+dhour
  6916.     tmin=tmin+dmin+1
  6917.     IF tmin>59 THEN
  6918.       DO
  6919.         thour=thour+tmin%60
  6920.         tmin=tmin//60
  6921.       END
  6922.     data.19=thour 'hours' tmin 'minutes in' calls+1 'calls.'
  6923.     CALL SETCLIP('BBS_totalusage',mmins%60 mmins//60)
  6924.     CALL SETCLIP('BBS_userlogoff',TIME('C') DATE())
  6925.     CALL postuser(6)
  6926.     IF newfilesflag=1 THEN
  6927.       DO
  6928.         newfilesdate=DATE('S') TIME()
  6929.         lastbrowse=countcheck(bbspath'Numbers/LastFile' 0)
  6930.       END
  6931.     IF clear_marked=1 THEN data.24=''
  6932.     CALL saveData(1)
  6933.     data.5=''
  6934.     IF EXISTS(bbspath'EmailFiles/'name'/QUICKIN.lha') THEN
  6935.       DO
  6936.         IF sortalphaflag>0 | savefileflag>0 THEN
  6937.           CALL SETCLIP('BBS_QUICK_WAIT',1)
  6938.         ADDRESS AREXX bbsQUICKIN.rexx name level sysoplevel bbsprefs.6
  6939.       END
  6940.     arg=''
  6941.     lastline=RIGHT(TIME('C'),7) LEFT(DATE(),6)
  6942.     lastline=lastline'  'RIGHT(city,40)
  6943.     lastline=OVERLAY(name,lastline,16,LENGTH(name)+1) RIGHT(bps,5)
  6944.     lastline=lastline' Time:'elapsed
  6945.     newpassword=''
  6946.     IF data.20=0 THEN lastline=OVERLAY('UNVALIDATED_USER',lastline,16,38)
  6947.     CALL send2last(lastline)
  6948.     CALL bbsLOGOFF.baud(name level elapsed) 
  6949.     SAY lastline||def||CR
  6950.   END
  6951.  
  6952. OUT2:
  6953. CALL send2log(line)
  6954.  
  6955. DONE:
  6956. CALL send2log('')
  6957. logonflag=0
  6958.  
  6959. DONE2:
  6960. CBVflag=0
  6961. CALL setdir(libpath||dirs.1)
  6962. CALL SETCLIP('BBS_winnings')
  6963. CALL SETCLIP('BBS_minutes')
  6964. CALL SETCLIP('BBS_level')
  6965. CALL SETCLIP('BBS_door')
  6966. Capture
  6967. IF RC~=0 THEN Capture OFF
  6968. Send '\c\ah'
  6969. IF WORDS(bbsprefs.27)=8 THEN CALL dimBBcols()
  6970. ELSE IF bbsprefs.27=1 THEN CALL ScreenToBack('BAUD')
  6971. ELSE IF bbsprefs.27=2 THEN Screen OFF
  6972. ELSE CALL DELAY(14)
  6973. Remote OFF
  6974. baud maxbps
  6975. IF sortuserflag=0 & sortalphaflag=0 & savefileflag=0 & emailonline>=0 & buildalpha=0 THEN
  6976.   CALL DELAY(128)
  6977. ELSE
  6978.   DO
  6979.     Send 'ATZH1\r'
  6980.     CALL DELAY(128)
  6981.     Send 'ATH1\r'
  6982.   END
  6983. IF buildalpha~=0 THEN
  6984.   DO
  6985.     CALL BuildALPHA.rexx()
  6986.     sortalphaflag=0
  6987.     savefileflag=0
  6988.     buildalpha=0
  6989.   END
  6990. IF sortuserflag=1 THEN
  6991.   DO
  6992.     CALL sortuserlist()
  6993.     IF SHOW('P','BBBBS_LOCAL') THEN
  6994.       DO
  6995.         CALL SETCLIP('BBS_localusers')
  6996.         CALL SETCLIP('BBS_mainusers',1)
  6997.       END
  6998.   END
  6999. IF sortalphaflag>0 | savefileflag>0 THEN
  7000.   DO
  7001.     IF savefileflag>0 THEN CALL savefilelist2()
  7002.     ELSE CALL savealphalist()
  7003.     IF SHOW('P','BBBBS_LOCAL') THEN CALL SETCLIP('BBS_mainfiles',2)
  7004.     CALL SETCLIP('BBS_QUICK_WAIT')
  7005.   END
  7006. IF emailonline<0 THEN CALL countmail()
  7007. bad_atz=ATZreset()   /* reset modem */
  7008. IF bbsprefs.15=0 THEN  /* quit or restart? */
  7009.   DO
  7010.     IF words(bbsprefs.27)=8 THEN CALL setBBcols()
  7011.     CALL checkstats()
  7012.     EXIT
  7013.   END
  7014. IF STORAGE()<bbsprefs.15 THEN
  7015.   DO
  7016.     IF words(bbsprefs.27)=8 THEN CALL setBBcols()
  7017.     SAY CR
  7018.     SAY '*** Unsafe memory level!'CR
  7019.     line='*** Less than' bbsprefs.15 'bytes available, BBBBS has been unloaded.'
  7020.     SAY line||CR
  7021.     SAY CR
  7022.     CALL send2log(line)
  7023.     EXIT
  7024.   END
  7025. CALL CLOSE(f)
  7026. CALL CLOSE('log')
  7027. CALL zerovars()
  7028. DO FOREVER
  7029.   IF GETCLIP('BBS_QUIT')='QUIT' THEN
  7030.     DO
  7031.       CALL SETCLIP('BBS_QUIT')
  7032.       CALL SETCLIP('BBS_maint')
  7033.       CALL SETCLIP('BBS_localfiles')
  7034.       CALL SETCLIP('BBS_localusers')
  7035.       Send '\c'
  7036.       IF words(bbsprefs.27)=8 THEN CALL setBBcols()
  7037.       EXIT
  7038.     END
  7039.   xstring=GETCLIP('BBS_interpret')
  7040.   IF xstring~='' THEN
  7041.     DO
  7042.       INTERPRET xstring
  7043.       CALL SETCLIP('BBS_interpret')
  7044.       SIGNAL DONE2
  7045.     END
  7046.   IF GETCLIP('BBS_localfiles')>1 & GETCLIP('BBS_maint')='' THEN
  7047.     DO
  7048.       CALL DELAY(150)
  7049.       Send 'ATH1\r'
  7050.       CALL SETCLIP('BBS_localfiles')
  7051.       CALL loadfiles()
  7052.       CALL loadalpha()
  7053.       SIGNAL DONE2
  7054.     END
  7055.   IF GETCLIP('BBS_localusers')~='' THEN
  7056.     DO
  7057.       CALL DELAY(150)
  7058.       Send 'ATH1\r'
  7059.       CALL SETCLIP('BBS_localusers')
  7060.       CALL loaduserlist()
  7061.       SIGNAL DONE2
  7062.     END
  7063.   IF bad_atz=1 THEN bad_atz=ATZreset()
  7064.   dcd
  7065.   IF RC~=0 THEN Send '\ah'
  7066.   wres=''
  7067.   Wait 'RING'
  7068.   wres=RESULT
  7069.   IF wres='RING' THEN
  7070.     DO
  7071.       Send 'ATA\r'
  7072.       Timeout 45  /* wait 45 seconds for connect */
  7073.       wres=''
  7074.       Wait 'CONNECT,NO CARRIER,RING,+FCON,+FHNG'
  7075.       wres=RESULT
  7076.       IF wres~='CONNECT' THEN SIGNAL DONE2
  7077.       CALL DELAY(114)
  7078.       SAY ' 'CR
  7079.       CALL DELAY(28)
  7080.       SAY ' 'CR
  7081.       dcd
  7082.       IF RC=0 THEN
  7083.         DO
  7084.           CALL DELAY(128)
  7085.           dcd
  7086.           IF RC=0 THEN
  7087.             DO
  7088.               CALL DELAY(128)
  7089.               dcd
  7090.               IF RC=0 THEN SIGNAL DONE2
  7091.             END
  7092.         END
  7093.       IF GETCLIP('BBS_maint')='' THEN
  7094.         DO
  7095.           CALL SETCLIP('BBS_interpret')
  7096.           IF words(bbsprefs.27)=8 THEN CALL setBBcols()
  7097.           ELSE IF bbsprefs.27=2 THEN Screen ON
  7098.           ELSE CALL DELAY(114)
  7099.           SAY ''CR    /* reset text defaults */
  7100.           SIGNAL LOGON
  7101.         END
  7102.       Remote ON
  7103.       SAY bbsname 'is busy with periodic maintenance.'CR
  7104.       SAY 'Please try again in a few minutes.'CR
  7105.       Send '\ah'
  7106.       SIGNAL DONE2
  7107.     END
  7108.   ELSE CALL checkstats()
  7109. END
  7110. EXIT
  7111.  
  7112.  
  7113. dimBBcols:
  7114. DO i=0 TO 7
  7115.   Send '\S'i'-'WORD('000 BA3 039 878 094 828 552 835',i+1)
  7116. END
  7117. RETURN
  7118.  
  7119.  
  7120. setBBcols:
  7121. DO i=0 TO 7
  7122.   Send '\S'i'-'WORD(bbsprefs.27,i+1)
  7123. END
  7124. RETURN
  7125.  
  7126.  
  7127. ATZreset:
  7128. TimeOut 10
  7129. Send 'ATZ\r'
  7130. Wait 'OK,RING'
  7131. IF RESULT~='OK' THEN
  7132.   DO
  7133.     Send '\d\wATZ\r'
  7134.     Wait 'OK'
  7135.     IF RESULT~='OK' THEN
  7136.       DO
  7137.         Send '\w\w+++\w\w\w\wATH\r'
  7138.         CALL sound('ATZ_FAIL')
  7139.         IF WORDS(bbsprefs.27)=8 THEN CALL setBBcols()
  7140.         ELSE IF bbsprefs.27=1 THEN CALL ScreenToFront('BAUD')
  7141.         ELSE IF bbsprefs.27=2 THEN Screen ON
  7142.         line='*** ATZ failed to reset!' TIME('C') DATE()
  7143.         SAY line'  Check your modem!!'CR
  7144.         CALL send2log(line)
  7145.         RETURN 1
  7146.       END
  7147.   END
  7148. TimeOut 45
  7149. Send '\dATH\r'
  7150. RETURN 0
  7151.  
  7152.  
  7153. getbaudrate: PROCEDURE
  7154. TRACE OFF
  7155. BaudRate
  7156. brate=RC
  7157. TRACE
  7158. RETURN brate
  7159.  
  7160.  
  7161. checkalias:
  7162. addressee=''
  7163. IF alias.0=0 THEN RETURN 0
  7164. DO i=1 TO alias.0
  7165.  IF UPPER(alias.i)=UPPER(string) THEN
  7166.   DO
  7167.    addressee=realname.i
  7168.    LEAVE i
  7169.   END
  7170. END
  7171. IF addressee='' THEN RETURN 0
  7172. string=''
  7173. SAY pen3'Email to 'def||addressee||CR
  7174. CALL editor('MAIL' addressee)
  7175. RETURN 0
  7176.  
  7177.  
  7178. Friends:
  7179. ch=''
  7180. aliasexclude='sysop bye off'
  7181. DO WHILE ch~='Q'
  7182.   SAY CR
  7183.   SAY pen3||LEFT('=',75,'=')def||CR
  7184.   SAY CENTER('F R I E N D S - L I S T',75)||CR
  7185.   SAY CR
  7186.   SAY CENTER('A L I A S   E D I T O R',75)||CR
  7187.   SAY pen3||LEFT('=',75,'=')def||CR
  7188.   SAY CR
  7189.   SAY '                           'pen3'W - 'def'What is the Friends List? 'CR
  7190.   SAY '                           'pen3'A - 'def'Add an Alias 'CR
  7191.   SAY '                           'pen3'D - 'def'Delete an Alias 'CR
  7192.   SAY '                           'pen3'V - 'def'View my Aliases 'CR
  7193.   SAY '                           'pen3'Q - 'def'Return to Main Menu'CR
  7194.   SAY CR
  7195.   ch=getinput(1 1 pen3'Enter Choice > 'def)
  7196.   SELECT
  7197.     WHEN ch='W' THEN CALL whatFriends()
  7198.     WHEN ch='A' THEN CALL addalias()
  7199.     WHEN ch='D' THEN CALL delalias()
  7200.     WHEN ch='V' THEN CALL viewalias()
  7201.     WHEN ch='Q' THEN CALL saveFriends()
  7202.     OTHERWISE SAY 'No such command'CR
  7203.   END
  7204. END
  7205. string=''
  7206. RETURN
  7207.  
  7208.  
  7209. saveFriends:
  7210. frn=bbspath'Friends/'name
  7211. IF alias.0<1 THEN
  7212.   DO
  7213.     CALL DELETE(frn)
  7214.     RETURN
  7215.   END
  7216. CALL OPEN(f,frn,'W')
  7217. DO i=1 TO alias.0
  7218.   CALL WRITELN(f,alias.i'  'realname.i)
  7219. END
  7220. CALL CLOSE(f)
  7221. RETURN
  7222.  
  7223.  
  7224. whatFriends:
  7225. CALL readlines(bbspath'Information/BBBBS.Friends' 1)
  7226. CALL cleanline(0)
  7227. CALL seelines(0)
  7228. IF waitchar~='Q' THEN CALL waiting()
  7229. nonstop=0
  7230. RETURN
  7231.  
  7232.  
  7233. addalias:
  7234. match=0
  7235. username=getinput(1 0 pen3'Enter Users Email Name > 'def)
  7236. username=cleanstring(1':'username)
  7237. IF username='' THEN RETURN
  7238. IF FIND(userlist,username)=0 THEN 
  7239.  DO
  7240.   SAY 'Username not found'CR
  7241.   RETURN
  7242.  END 
  7243. newalias=getinput(1 0 pen3'Enter an Alias for'def' 'username def'> ')
  7244. IF newalias='' THEN RETURN
  7245. IF alias.0>0 THEN
  7246.   DO i=1 TO alias.0
  7247.    IF UPPER(alias.i)=UPPER(newalias) THEN match=1
  7248.   END
  7249. IF FIND(aliasexclude,newalias)>0 THEN match=2
  7250. IF match=0 THEN 
  7251.   DO 
  7252.    alias.0=alias.0+1
  7253.    num=alias.0
  7254.    alias.num=newalias
  7255.    realname.num=username
  7256.    SAY alias.num 'alias as ' realname.num 'added'CR
  7257.   END
  7258. ELSE IF match=1 THEN SAY 'Alias 'newalias' already exists'CR
  7259. ELSE SAY newalias ' is a reserved name'CR
  7260. RETURN
  7261.  
  7262.  
  7263. delalias:
  7264. match=0
  7265. dalias=getinput(1 0 pen3'Enter Alias to Delete > 'def)
  7266. dalias=UPPER(WORD(dalias,1))
  7267. IF alias.0>0 THEN
  7268.   DO i=1 TO alias.0
  7269.    IF UPPER(alias.i)=UPPER(dalias) THEN 
  7270.     DO 
  7271.      match=1
  7272.      num=i
  7273.      LEAVE i
  7274.     END
  7275.   END
  7276. IF match=1 THEN 
  7277.  DO
  7278.   IF getinput(1 1 'Really Delete 'dalias'? (Ny) > ')='Y' THEN
  7279.    DO
  7280.     DO i=num TO alias.0
  7281.      j=i+1
  7282.      alias.i=alias.j
  7283.      realname.i=realname.j
  7284.     END
  7285.     alias.0=alias.0-1
  7286.    END
  7287.  END
  7288. ELSE SAY dalias' not Found.'CR
  7289. RETURN
  7290.  
  7291.  
  7292. viewalias:
  7293. IF alias.0>0 THEN
  7294. DO i=1 TO alias.0
  7295.  SAY RIGHT(alias.i,22) 'is' realname.i||CR
  7296. END
  7297. ELSE SAY 'No Aliases assigned'CR
  7298. RETURN
  7299.  
  7300.  
  7301. upCBV:
  7302. ARG res .
  7303. temp=bbspath'Lists/CBV_USERS'
  7304. IF EXISTS(temp) THEN t2='A'
  7305. ELSE t2='W'
  7306. x=OPEN(f,temp,t2)
  7307. IF x=0 THEN RETURN 1
  7308. IF t2='W' THEN CALL WRITELN(f,'*** Call Back Verify Log ***')
  7309. temp=RIGHT(TIME('C'),7) COMPRESS(DATE())
  7310. temp=temp LEFT(name,24) RIGHT(telnum' RESULT:',20) res
  7311. CALL WRITELN(f,temp) 
  7312. CALL CLOSE(f)           
  7313. RETURN 0
  7314.  
  7315.  
  7316. CBV:
  7317. IF bbsprefs.22=0 THEN RETURN
  7318. SAY CR
  7319. CALL showtext(bbspath'BBS_TEXT/CBV_INFO')
  7320. SAY CR
  7321. telnum=getinput(1 0 pen7'Please Enter Phone Number For Call Back: 'def )
  7322. mask=COMPRESS(XRANGE(),'0123456789-, @#*')
  7323. telnum=COMPRESS(telnum,mask)
  7324. IF telnum='' THEN RETURN
  7325. DO n=1 WHILE n<LENGTH(telnum) & ~DATATYPE(SUBSTR(telnum,n,1),'W')
  7326. END
  7327. IF SUBSTR(telnum,n,1)<2 THEN
  7328.   DO
  7329.     SAY 'No long distance numbers, please!'CR
  7330.     RETURN
  7331.   END
  7332. temp='The BBS will now call' telnum 'to verify. Correct? (Ny) > '
  7333. IF getinput(1 1 temp)~='Y' THEN RETURN
  7334. CALL sound('CBV')
  7335. telnum=COMPRESS(telnum)
  7336. data.27=STRIP(data.27 telnum)
  7337. SAY pen3'Logging Off. Callback to' telnum 'in 30 seconds.'def||CR
  7338. SAY 'When your modem rings, type  ATA  and press RETURN.'CR
  7339. SAY pen2'GoodBye for now,' name '.'def||CR
  7340. REMOTE OFF
  7341. Timeout 10
  7342. Send '\ah'
  7343. Wait 'OK,RING'
  7344. IF RESULT~='OK' THEN
  7345.   DO
  7346.     Send '\d'
  7347.     CALL DELAY(50)
  7348.     DO n=1 TO 10 WHILE ATZreset()=1
  7349.     END
  7350.   END
  7351. CALL DELAY(50)
  7352. Send 'ATH1\r'
  7353. SAY CR
  7354. CALL DELAY(100)
  7355. SAY CR
  7356. DO n=14 TO 1 BY -1
  7357.   MSG '1B'x'M' n*2 'seconds left before CBV callback...'
  7358.   CALL DELAY(100)
  7359. END
  7360. MSG lineup 'Beginning CBV callback...               '
  7361. SAY CR
  7362. Timeout 10
  7363. Send '\ah'
  7364. Wait 'OK'
  7365. IF RESULT~='OK' THEN
  7366.   DO
  7367.     Send '\d'
  7368.     CALL DELAY(50)
  7369.     DO n=1 TO 10 WHILE ATZreset()=1
  7370.     END
  7371.   END
  7372. CALL DELAY(50)
  7373. Send 'ATL3M1DT'telnum'\r'  /* M1 = Speaker ON, L3 = volume up */
  7374. Timeout 90
  7375. Wait 'CONNECT,NO CARRIER,BUSY,ERROR'
  7376. IF RESULT~='CONNECT' THEN 
  7377.   DO
  7378.     CALL upCBV('FAILED')
  7379.     SIGNAL OUT
  7380.   END
  7381. REMOTE ON
  7382. DO i=20 TO 0 BY -1
  7383.   SAY CENTER(copyright.i,75)||CR
  7384. END
  7385. SAY CENTER(bbsname 'Call Back Identity Verification',74)||CR
  7386. SAY CR
  7387. CBVflag=1
  7388. Timeout maxidle
  7389. DO cnt=1 TO 3
  7390.   Namentr=getinput(1 0 pen3'    Enter Name: 'def)
  7391.   Namentr=cleanstring('1:'Namentr)
  7392.   IF Namentr=name THEN LEAVE cnt
  7393. END
  7394. DO count=1 TO 4
  7395.   IF cnt>3 | count>3 THEN
  7396.     DO
  7397.       SAY 'Incorrect Entry!'||CR
  7398.       SAY 'Verification Denied.'||CR
  7399.       SAY pen2'Leave a 'pen3'['pen7'C'pen3']omment'pen2'to SysOp,'CR
  7400.       SAY pen2'for manual verification.'CR
  7401.       SAY CR
  7402.       CALL upCBV('DENIED')
  7403.       SIGNAL OUT
  7404.     END
  7405.   pw=getinput(1 0 pen3'Enter Password: 'def)
  7406.   IF UPPER(pw)=data.5 THEN
  7407.     DO
  7408.       CALL upCBV('VERIFIED')
  7409.       v=GETCLIP('BBS_COMMAND')'V'
  7410.       CALL SETCLIP('BBS_COMMAND',v)
  7411.       CBVflag=0
  7412.       RETURN
  7413.     END
  7414. END
  7415. RETURN
  7416.  
  7417.  
  7418. /* BBBBS.baud */
  7419.